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'}),
# ...