结合金字塔与 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,
)
我有一个使用以这种方式定义的翻译工厂的金字塔应用程序:
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,
)