tornado with i18n

2014年04月27日

i18n是国际化的简称(Internationalization,去掉开始的I和最后的N,中间一共18个字符)。 tornado中使用i18n需要下面两个工具 两个工具:pygettext,msgfmt,两个相关文件:po文件和mo文件

pygetext和msgfmt的使用方法:

编写python代码文件 test.py

from gettext import gettext as _
print _("well down")
print _("good")

pygetext test.py

生成messages.pot文件,更改文件后缀 mv messages.pot messages.po 配置msgstr值

生成一个名为messages.mo文件: msgfmt messages.po

建立目录locale/cn/LC_MESSAGES/

mv messages.po locale/cn/LC_MESSAGES

cn目录是所对应的语言,LC_MESSAGES是gettext.py文件里要求的 mo文件必须和所定义的域同名 gettext.py中有 modfile=os.path.join(localedir,lang,’LC_MESSAGES’,’%s.mo’ %domain)

测试: $python  »>gettext.install(‘messages’,’./locale’,unicode=True) 三个参数: 作用域名,用于限定翻译文件的主名 路径,存放翻译文件的路径 unicode,是否使用unicode(如果应用程序是unicode的,此处应设为True)

>>>gettext.translation('messages','./locale',languages=['cn']).install(True)
>>>print _("good")

在tornado中使用时:

$xgettext -L python -k=_ -o openquant.po $(find . -name \*.py) $(find template/ -name \*.html) 查找所有需要翻译的相关项生成 po 文件

$msgfmt openquant.po -o locale/zh_CN/LC_MESSAGES/openquant.mo 生成mo文件

完成相关文件的生成后,需要在代码中加载:

tornado.locale.load_gettext_translations(options.I18N_PATH,"openquant")

handler中自定义get_user_locale函数:

def get_user_locale(self):
    #zh_CN or en_US
    user_locale = self.get_cookie("user_locale")

    if user_locale:
        return tornado.locale.get(user_locale)

    return None

参考文章:

iMind

django多国语言


期待您的分享与讨论: