为了赶上国际化的潮流,或者单单是为了汉化歪果仁的优秀成果,使用i18n可以方便的完成国际化。
1 简介
摘自《开源世界旅行手册》作者:kardinal
习惯上,internationalization(国际化)简写为I18N,中间的数字为省略的字母个数。
在 Linux 系统中,通过定义一组环境变量来设置程序的语言环境,以实现对I18N的支持,这种机制称为:locale(本地化)
[email protected]:~$ locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
[email protected]:~$
locale 变量LANG 低优先级全局 locale 变量 如果下面的变量未赋值,默认使用此变量的值
LC_COLLATE 比较和排序习惯 会影响目录列表的分类显示等
LC_CTYPE 定义系统的字符处理特性 哪些字符能被视为字母、数字,等等;与中文输入关系密切
LC_MESSAGES 提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等
LC_MONETARY 定义货币单位和货币型数值的格式
LC_NUMERIC 定义非货币型数值的格式 影响到千位分隔符和小数分隔符等
LC_TIME 定义日期和时间的格式
LC_NAME 姓名书写方式
LC_ADDRESS 地址书写方式
LC_TELEPHONE 电话号码书写方式
LC_MEASUREMENT 度量衡表达方式
LC_PAPER 定义默认的纸张尺寸
LC_IDENTIFICATION 对 locale 自身包含信息的概述
LC_ALL 高优先级全局 locale 变量 为此变量赋值会强行覆盖上面变量的值,不推荐
假如未设置以上变量,系统将采用 POSIX 作为 lcoale,也就是 C locale
locale值locale 变量的值有三个要素:语言代码 (Language Code)、 地域代码 (Country Code) 和字符集(Encoding)(中文 Windows 系统中使用的字符集为GB2132,而 UTF-8 是大势所趋,它能够显示比 GB2132 更多的字符)
语言代码[_地域代码[.字符集]]例如:
语言/国家代码 描述
en_US.ISO-8859-1 美国英语
en_US.UTF-8
zh_CN.UTF-8 简体中文
zh_TW.UTF-8 繁体中文
字符集众所周知,计算机中的信息,是以数字形式表示的,字符也不例外。字符以数字编号的形式存储,使用时,根据这个编号,在字符集中找到相应的字符
字符集是字符在系统内的编码方式,也就是通常所说的内码。不同的字符集有不同的编码方式,
例如“码”字,它的 GB2312编码 为 426B;UTF-8编码 为 E7A081 。如果错误的以 GB2312编码 来检索 E7A081,将会产生类似 “锘跨爜” 的乱码
只要系统中安装了中文字体,通过字符集的支持,便可以正常显示中文,而无需设置 locale;locale 可以使操作界面显示中文,并可以使用中文输入等
其他另外还有一个本地化变量叫做 LINGUAS。它会影响到基于 gettext 的程序;它还能决定某些特殊软件包的本地化,比如kde-i18n和openoffice。这个变量的值为一组以空格分隔的语言代码:
LINGUAS="zh en"
2 PO文件和MO文件
PO 是 Portable Object (可移植对象)的缩写形式;MO 是 Machine Object (机器对象) 的缩写形式。PO 文件是面向翻译人员的、提取于源代码的一种资源文件。当软件升级的时候,通过使用 gettext 软件包处理 PO 文件,可以在一定程度上使翻译成果得以继承,减轻翻译人员的负担。MO 文件是面向计算机的、由 PO 文件通过 gettext 软件包编译而成的二进制文件。程序通过读取 MO 文件使自身的界面转换成用户使用的语言。
3 I18N 主要使用什么工具工作?
I18N 主要使用 gettext 软件包使软件实现国际化支持。事实上它是一整套 I18N 解决方案。
4 PO和MO文件的转化
po文件和mo文件通过msgfmt工具转化。
创建po文档:在当前目录下创建locale文件夹,下面分别建en_US/LC_MESSAGES/ 和 zh_CN/LC_MESSAGES/目录。
创建mo文档:在当前目录下使用msgfmt程序转换po文件到莫文件。
Note:
.调用python安装目录的 Tools/i18n/pygettext.py抽取所需翻译的模板
>>> pygettext.py path/to/yourfile.py
将生成一个名为messages.pot的文件
2.生成模板文件后,修改这个模板文件,其中的msgid为键值,对应你程序里写的文本,如:_("New File"),而msgstr为翻译后的值。还有就是注意修改文件头部分Content-Type的charset为合适的编码,比如utf8
3.编写好模板后,把扩展名修改为.po,运行Tools/i18n/msgfmt.py,生成二进制的资源文件
>>> msgfmt.py messages.po
将生成一个名为messages.mo的文件
4.把这个mo文件放在正确的位置.
比如你在程序中是这样写的:
gettext.install(‘i18ntest‘, ‘./locale‘, unicode=True)
gettext.translation(‘i18ntest‘, ‘./locale‘, languages=[‘cn‘]).install(True)
那么你的程序目录下需要存在./local/cn/LC_MESSAGES/i18ntest.mo
这样程序启动时就会读取这个资源文件,替换对应的文本,实现国际化了。
注意:如果使用utf格式保存,po文件不能有BOM头。cn目录是所对应的语言,LC_MESSAGES目录是gettext.py里要求的,mo文件必须和所定义的域同名,见
gettext.py的mofile = os.path.join(localedir, lang, ‘LC_MESSAGES‘, ‘%s.mo‘ % domain)