Mako国际化¶
备注
此配方经许可从 blog post made by Alexandre Bourget .
首先,在 Pyramid 项目的 __init__.py
.
1def main(...):
2 # ...
3 config.add_subscriber('YOURPROJECT.subscribers.add_renderer_globals',
4 'pyramid.events.BeforeRender')
5 config.add_subscriber('YOURPROJECT.subscribers.add_localizer',
6 'pyramid.events.NewRequest')
然后添加 subscribers.py
模块到项目的包目录。
1# subscribers.py
2
3from pyramid.i18n import get_localizer, TranslationStringFactory
4
5def add_renderer_globals(event):
6 # ...
7 request = event['request']
8 event['_'] = request.translate
9 event['localizer'] = request.localizer
10
11tsf = TranslationStringFactory('YOUR_GETTEXT_DOMAIN')
12
13def add_localizer(event):
14 request = event.request
15 localizer = get_localizer(request)
16 def auto_translate(*args, **kwargs):
17 return localizer.translate(tsf(*args, **kwargs))
18 request.localizer = localizer
19 request.translate = auto_translate
After this has been done, the next time you start your application, in your Mako template, you'll be able to use the simple ${{_(u"Translate this string please")}}
不必使用 get_localizer
explicitly, as its functionality will be enclosed in the _
函数,该函数将作为顶级模板名公开。 localizer
will also be available for plural forms and fancy stuff.
这也将允许您在视图代码中使用翻译,使用如下内容:
def my_view(request):
_ = request.translate
request.session.flash(_("Welcome home"))
要使所有这些都起作用,您需要:
1(env)$ easy_install Babel
您还需要在项目目录中运行这些命令:
1(env)$ python setup.py extract_messages
2(env)$ python setup.py init_catalog -l en
3(env)$ python setup.py init_catalog -l fr
4(env)$ python setup.py init_catalog -l es
5(env)$ python setup.py init_catalog -l it
6(env)$ python setup.py update_catalog
7(env)$ python setup.py compile_catalog
重复 init_catalog
为你需要的每一种语言迈出一步。
备注
项目的GETEXT子目录是 locale/
在 Pyramid 里,而不是 i18n/
就像在 Pylons 上一样。您会注意到在 Pyramid 项目的默认setup.cfg中。
此时,您还需要将本地目录添加到项目的配置中。
def main(...):
# ...
config.add_translation_dirs('YOURPROJECT:locale')
最后,当您运行extract_消息时,您希望提取您的mako文件,因此将这些文件添加到您的setup.py中(是的,您在setup.py中正确读取了我的信息,这样babel可以在调用它的命令时使用它)。
1setup(
2 # ...
3 install_requires=[
4 # ...
5 Babel,
6 # ...
7 ],
8 message_extractors = {'yourpackage': [
9 ('**.py', 'python', None),
10 ('templates/**.html', 'mako', None),
11 ('templates/**.mako', 'mako', None),
12 ('static/**', 'ignore', None)]},
13 # ...
14 )
上面的元素是最后一个元素的三倍, None
在此代码段中,可以用于将选项字典传递给指定的提取程序。例如,您可能需要使用相应的选项设置mako输入编码。
# ...
('templates/**.mako', 'mako', {'input_encoding': 'utf-8'}),
# ...