GAE网络应用程序的国际化和Babel
你想知道如何使用 BABEL 来国际化一个 Google App Engine 的网页应用吗?我这里会介绍所有的步骤:
- 标记需要翻译的字符串。
- 提取这些字符串。
- 进行翻译。
- 配置你的应用,让它根据浏览器请求加载正确的语言。
1 个回答
11
1) 在你的代码和模板中使用 _()(或者 gettext())。在模块的全局变量或类定义中设置的翻译字符串应该使用某种形式的懒加载 gettext(),因为在导入模块时国际化(i18n)是不可用的。
2) 使用 pybabel 提取所有翻译。这里我们需要扫描两个目录:一个是模板目录,另一个是应用程序目录。这会在 /locale 目录下创建一个 messages.pot 文件,里面包含在这两个目录中找到的所有字符串。babel.cfg 是提取配置,具体内容会根据你使用的模板引擎有所不同:
$ pybabel extract -F ./babel.cfg -o ./locale/messages.pot ./templates/ ./app/
3) 为每种语言初始化一个目录。这一步只需要做一次。在这里我们初始化了三种翻译,分别是 en_US(英语),es_ES(西班牙语)和 pt_BR(巴西葡萄牙语),并使用在第二步创建的 messages.pot 文件:
$ pybabel init -l en_US -d ./locale -i ./locale/messages.pot
$ pybabel init -l es_ES -d ./locale -i ./locale/messages.pot
$ pybabel init -l pt_BR -d ./locale -i ./locale/messages.pot
翻译这些消息。翻译结果会保存在每个翻译目录中的 .mo 文件里。所有语言的翻译完成后,进行编译:
$ pybabel compile -f -d ./locale
之后,如果添加了新的翻译,就重复第二步,并使用新的 .pot 文件更新它们:
$ pybabel update -l pt_BR -d ./locale/ -i ./locale/messages.pot
然后翻译新的字符串,再次编译翻译结果。
4) 这里的策略可能会有所不同。对于每个请求,你必须设置正确的翻译,并且可能希望缓存已加载的翻译,以便在后续请求中重复使用。