结合金字塔与 jinja2 install_gettext_translations 功能?

Combina pyramid with jinja2 install_gettext_translations function?

我有一个使用以这种方式定义的翻译工厂的金字塔应用程序:

from pyramid.i18n import get_localizer, TranslationStringFactory
from pyramid.threadlocal import get_current_request


def add_renderer_globals(event):
    request = event.get('request')
    if request is None:
        request = get_current_request()
    event['_'] = request.translate
    event['localizer'] = request.localizer

tsf = TranslationStringFactory('climmob3')

def add_localizer(event):
    request = event.request
    localizer = get_localizer(request)

    def auto_translate(string):
        return localizer.translate(tsf(string))
    request.localizer = localizer
    request.translate = auto_translate

它工作正常,但是我在其他地方使用 jinja2 render() 函数将小块可重用代码(片段)呈现为 jinja2 扩展:

from jinja2 import Environment
jinjaEnv = Environment(extensions=['jinja2.ext.i18n'])

output = template.render(snippetVars=kw,renderer='snippet')

这里的问题是,当我在模板代码中使用“_”翻译函数时,我得到:

UndefinedError: 'gettext' is undefined

我看到了一些可能需要使用 jinjaEnv.install_gettext_translations() 的帖子,但我无法让它工作。我试过了:

jinjaEnv.install_gettext_translations(pyramid.il8n)
jinjaEnv.install_gettext_translations(tsf)

如何将 jinjaEnv.install_gettext_translations() 与我的金字塔翻译工厂集成?

根据具体情况,您可以使用 pyramid_jinja2 或从中获取灵感。它创建一个 GetTextWrapper https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/i18n.py that makes its way in the options passed when creating the Environment https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/settings.py#L133 https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/__init__.py#L394 https://github.com/Pylons/pyramid_jinja2/blob/28944ce627745691ccd1603c56251e038aadd892/pyramid_jinja2/__init__.py#L404-L405

需要包装器,因为本地化程序会根据用户区域设置更改每个请求。

或者在渲染时直接传递gettext和ngettext参数。在你的情况下,它看起来像:

localizer = request.localizer

def gt(message):
    return localizer.translate(message, domain='your-domain')

def ngt(singular, plural, n):
    return localizer.pluralize(singular, plural, n, domain='your-domain')

output = template.render(
    snippetVars=kw,
    renderer='snippet',
    gettext=gt,
    ngettext=ngt,
    )