7.11 国际化模块,让翻译更优雅

http://image.iswbm.com/20200804124133.png

国际化与本地化

国际化 (internationalization),简称 i18n

很多人并不知道,为什么要叫 i18n 呢?怎么谐音都不对。

实际上 18 是指在 ”internationalization” 这个单词中,i 和 n之间有18个字母。

而与之相对的,本地化(localization),简称 L10 n,10 就是指在 ”localization”这个单词中,l 和 n 之间有10个字母

本地化是指使一个国际化的软件为了在某个特定地区使用而进行实际翻译的过程。

国际化的软件具备这样一种能力,当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正。

gettext 模块

gettext 是一套 GNU下的国际化工具。主要有工具:

  • xgettext: 从源码中抽取字符串,生成po文件(portable object)

  • msgfmt: 将po文件编译成mo文件(machine object)

  • gettext: 进行翻译,如果找不到gettext命令,或者找不到msgfmt命令。请重新安装一遍gettext套件。

很多系统中都内置了 gettext 模块

如果你在 ubuntu系统中,可能需要如下命令进行安装

sudo apt-get install gettext

简单示例演示

首先新建一个目录

$ mkdir -p locale/zh_CN/LC_MESSAGES

然后在这个目录下新建一个 hello.po 文件

msgid "hello world"
msgstr "你好世界"

然后执行如下一条命令,将 po 文件翻译成 mo文件

$ msgfmt locale/zh_CN/LC_MESSAGES/hello.po -o locale/zh_CN/LC_MESSAGES/hello.mo

然后在 local 同级目录下进入 Console 模式,就可以使用 _ 进行翻译了,为什么 _ 能这么用,原因是 zh.install() 这个调用将其绑定到了 Python 内建命名空间中,以便在应用程序的所有模块中轻松访问它。

>>> import gettext
>>> zh = gettext.translation("hello", "locale", languages=["zh_CN"])
>>> zh.install()
>>> _('hello world')
'你好世界'