yafanzhao

python程序中使用gettext实现程序的本地化

    python程序中可以使用gettext模块实现程序语言的国际化/本地化。
    下面是一个简单的例子:
1. 首先,修改源码以使用gettext模块。
为了节省键盘输入的时间,一般将gettext.gettext() 函数重新定义为 _() 。
#!/usr/bin/env python
"""
A script to test the gettext module
"""
import gettext
gettext.bindtextdomain('testapp', 'locale/')
gettext.textdomain('testapp')
_ = gettext.gettext
# ...
boxnum = 7
catnum = 10
boxseq = 2
print _('This is a translatable string.')
print _("I have %(num)d boxes.") %{'num':boxnum}
print _("I have %d cats.") %(catnum)
print _("Therer are %(num)d cats in box N.O. %(seq)d.") %{'num':catnum, 'seq':boxseq}

将以上的内容保存为test_hello_gettext.py
2. 然后,使用gettext模块中的xgettext程序来提取可以翻译的字符串。
    xgettext -d test_hello_gettext -o test_hello_gettext.pot test_hello_gettext.py
-d, --default-domain=名称   使用<名称.po>输出(而不是 messages.po)
-o, --output=文件           将输出写入指定文件
      使用上述的命令获得了一个待翻译的模板文件。
3. 我们希望将程序中的输出用中文显示,可以用模板文件生成待翻译中文po文件。
msginit -l zh_CN -o zh_CN.po -i test_hello_gettext.pot
msginit程序会询问你的电子邮件地址,这个地址也会写入到新生成的po文件中。
4. 接下来,将po文件中需要翻译的语句翻译成中文,翻译以后的po文件是这样的:
# Chinese translations for PACKAGE package.
# Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Zhang San <zhangsan@email.com>, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-03-10 11:17+0800\n"
"PO-Revision-Date: 2015-03-10 11:19+0800\n"
"Last-Translator: Zhang San <zhangsan@email.com>\n"
"Language-Team: Chinese (simplified) <translation-team-zh-cn@lists."
"sourceforge.net>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: test_hello_gettext.py:13
msgid "This is a translatable string."
msgstr "这是一个可翻译的字符串。"

#: test_hello_gettext.py:14
#, python-format
msgid "I have %(num)d boxes."
msgstr "我有%(num)d个盒子。"

#: test_hello_gettext.py:15
#, python-format
msgid "I have %d cats."
msgstr "我有%d只猫。"

#: test_hello_gettext.py:16
#, python-format
msgid "Therer are %(num)d cats in box N.O. %(seq)d."
msgstr "第%(seq)d个盒子里有%(num)d只猫."
  po文件的格式不能轻易改变,所以最好使用专用的编辑器或者编辑模式来进行翻译。
5. 翻译完成po文件以后,需要将po文件转换成读取更加迅速的mo文件。
msgfmt -c -v -o testapp.mo zh_CN.po
注意,mo文件的名称需要和源码中textdomain一致。
     最后,需要将mo文件放在合适的位置。在这个例子中,程序会到locale文件夹中寻找合适的mo文件,中文翻译的mo文件放在
locale/zh_CN/LC_MESSAGES/文件夹中。
运行测试:
LANG=zh_CN ./test_hello_gettext.py
这是一个可翻译的字符串。
我有7个盒子。
我有10只猫。
第2个盒子里有10只猫.
LANG=C ./test_hello_gettext.py
This is a translatable string.
I have 7 boxes.
I have 10 cats.
Therer are 10 cats in box N.O. 2.

注意:为了实现更加灵活通顺的翻译,字符中变量的顺序不应该固定。
例如:
print "Therer are %d cats in box N.O. %d." %(catnum, boxseq)
其效果就不如
print "Therer are %(num)d cats in box N.O. %(seq)d." %{'num':catnum, 'seq':boxseq}
翻译时,msgid为
msgid "Therer are %(num)d cats in box N.O. %(seq)d."
其翻译可以是:
msgstr "第%(seq)d个盒子里有%(num)d只猫。"
而不一定必须是:
msgstr "有%(num)d只猫在第%(seq)d个盒子里。"

评论

热度(2)