创建翻译
1babel-init:
2 cd $(THEMEDIR) && pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot ./ && pybabel init -i messages.pot -d translations -l en
3
4babel-update:
5 cd $(THEMEDIR) && pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot ./ && pybabel update -i messages.pot -d translations
6
7babel-compile:
8 cd $(THEMEDIR) && pybabel compile -d translations
动态变量
在模板里,我有一些动态变量需要翻译,比如在分类里的 Python 需要翻译成 生活苦短,但很不幸, Babel并不支持动态变量的翻译。
刚开始,在我没使用i18n_subsites时,我采用加载一个i18n.html文件
1{% macro gettext(string) -%}
2{% set _gettext=dict(
3 python='人生苦短',
4 security='极客安全',
5 archives='文章归档',
6) %}
7{{ _gettext.get(string.lower(),string) }}
8{%- endmacro %}
类似字典的形式对部分变量进行翻译,这能够工作的很好,虽然有些麻烦。
在使用Babel之后,我想要把它和messages.po统一管理,所以采用另一种比较折中的方案: jinja2 filter
1from babel import support
2
3def gettrans(text, locale=DEFAULT_LANG):
4 translations = support.Translations()
5 catalog = support.Translations.load(
6 os.path.abspath(os.path.join(THEME, "translations")), locale)
7 translations.merge(catalog)
8 if hasattr(catalog, 'plural'):
9 translations.plural = catalog.plural
10 return translations.gettext(text)
11
12JINJA_FILTERS = {
13 'gettrans': gettrans,
14}
这样就可以通过传递变量来获取对应的翻译, 而我所需要做的就是写好messages.po然后编译成messages.mo即可,同样为了每次使用pybabel update 都可以得到相同的内容,我使用了一种取巧的办法, 同样是i18n.html文件,把所需要国际化的可能变量全部放到一起,但不要在其它模板里import这个模板,这样每次更新翻译文件,Babel 都能自动找到并生成相同的messages.po文件
1{% macro gettrans(string) -%}
2 {% set _gettrans=[
3 _("Linux"),
4 _("Python"),
5 _("Security"),
6 _("友链"),
7 _("联系")] %}
8{%- endmacro %}
这种方式同样解决了我的另一个问题: 我可能在中文站点使用的是英文变量,但需要显示翻译后的中文,而在英文站点使用英文变量,显示的却同样是英文。说起来比较绕口,简单来说就是,中文站点里有一个Python变量,我需要显示为人生苦短 , 而在英文站点,则显示为 Python,毕竟我可以在zh_CN/LC_MESSAGES/messages.po写上翻译后的内容,而在en/LC_MESSAGES/messages.po里保持原样,很方便地做到中英文分离。
知识共享署名-非商业性使用-相同方式共享4.0国际许可协议