目录

tornado 国际化实践

tornado i18n国际化

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

pygetext和msgfmt的使用方法

  1. 编写python代码文件 test.py

    1
    2
    3
    
    from gettext import gettext as _
    print _("well down")
    print _("good")
    
  2. 运行以下命令

    1
    
    pygetext test.py
    
  3. 生成messages.pot文件,更改文件后缀

    1
    
    mv messages.pot messages.po
    
  4. 配置msgstr值
    生成一个名为messages.mo文件:

    1
    2
    3
    
    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)

    测试:

    1
    2
    
    $python
    >>>gettext.install('messages','./locale',unicode=True)
    

    三个参数:

    • 作用域名:用于限定翻译文件的主名
    • 路径:存放翻译文件的路径
    • unicode:是否使用unicode(如果应用程序是unicode的,此处应设为True)
    1
    2
    
    >>>gettext.translation('messages','./locale',languages=['cn']).install(True)
    >>>print _("good")
    

tornado中的应用

  1. 运行以下命令

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

    1
    
    $msgfmt openquant.po -o locale/zh_CN/LC_MESSAGES/openquant.mo
    

完成mo文件的生成

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

    1
    
    tornado.locale.load_gettext_translations(options.I18N_PATH,"openquant")
    
  2. handler中自定义get_user_locale函数:

    1
    2
    3
    4
    5
    6
    7
    8
    
    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
    

参考