Just 做 IT

求知若饥 虚心若愚 안년하세요 (•‾̑⌣‾̑•)

Tornado 的 i18n (国际化)

1 year ago 0

目前 Tornado (2.1) 的国际化翻译文件支持两种方式:
CSVLocale, 翻译文件存在一个 CVS 格式的文件中,我还没有试过这种方式
GettextLocale, 传统的 gettext 方式,翻译文件存在 XXX.mo 文件里
使用 GettextLocale

假设项目名字叫 luoyun , 以中文国际化为例,在项目主目录下建立 "locale/zh_CN/LC_MESSAGES/" 目录,在启动 Tornado web server 时,执行下面指令加载 i18n 支持:

tornado.locale.load_gettext_translations(settings.I18N_PATH, "luoyun")
其中 settings.I18N_PATH 是 locale 目录的绝对路径。 "luoyun" 是项目的名字(Tornado 据此名字在 /path/to/locale/zh_CN/LC_MESSAGES/ 目录里查找翻译文件luoyun.mo)

设置默认的 locale

默认的 locale 是 en_US, 可以通过下面指令设置为 zh_CN :

tornado.locale.set_default_locale('zh_CN')

注意:如果你想要多语言支持,以供用戶自由选择。请为所有支持的语言准备好 "/path/to/locale/你的Locale目录/LC_MESSAGES/luoyun.mo" 文件。(如果同时想使用 tornado.locale.set_default_locale 指令,请为 en_US 准备 /path/to/locale/en_US/LC_MESSAGES/luoyun.mo 文件,如有问题,细看 tornado/locale.py 代码)

翻译字符串

_("可翻译的字符串")
其中 "_" 即 "self.locale.translate" 。

生成 po 文件

在项目主目录下,将所有的 py 文件和 template 目录里的所有 html 文件都加入翻译队列:


xgettext -L python -k=_ -o luoyun.po $(find . -name \*.py) $(find template/ -name \*.html)

xgettext 使用请参看具体手册

生成 mo 文件

$ msgfmt luoyun.po -o locale/zh_CN/LC_MESSAGES/luoyun.mo
msgmerge 命令可以合并以前的翻译结果到新的文件中,这样不用每次从头翻译了。

$ msgmerge old.po current.po > new.po
让用户自己选择语言

要想让用戶能自己选择语言,必须重新定义 RequestHandler 的 get_user_locale 方法。示例是我根据用戶的 cookie 中保存的 "user_locale" 值,以获取一个 locale 对象:


class LyRequestHandler(RequestHandler):

    def get_user_locale(self):

        user_locale = self.get_cookie("user_locale")

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

        return None

用户的 cookie 中的 "user_locale" 值是我根据用戶的一次请求设置的,SetLocale 请求处理类示例:

class SetLocale(LyRequestHandler):
    def get(self):
        self.writing('Just for POST !')

    def post(self):
        user_locale = self.get_argument("language")
        self.set_cookie("user_locale", user_locale)
        self.redirect('/')

最后,完成用戶远择,你还要在 HTML 中设计一个表单,以便可以使用上面的 post 方法。

          <form action="/i18n/setlang" method="post">
            <select name="language">
              <option value="zh_CN">简体中文</option>
              <option value="en_US" selected="selected">English</option>
            </select>
            <input type="submit" value=选择 />
          </form>

"/i18n/setlang" (访 Django 的方法) 绑定在 SetLocale 请求处理类上:

    (r'/i18n/setlang', home.SetLocale),

Write a Comment