如何在带有 i18n 的 mako 渲染模板中使用 _?

How to use _ in mako rendering template with i18n?

现在我正在使用金字塔框架和mako模板引擎。并希望添加 i18n 功能。

我这样写代码没有问题:

myprj/templates/index.html

<h1>${_('Home')}</h1>

可以正确读取编译后的.mo文件,并显示部分语言的翻译信息。

但是如果我这样使用它:

myprj/templates/show.html

${_context.detail_panel(order)}

并在此文件中写入代码:

myprj/templates/_detail_panel_a.html

<h1>${_('Detail')}</h1>

显示此错误:

Traceback (most recent call last):
...
File "/mypath/myprj/templates/_detail_panel_a.html", line 5, in render_body
<h1>${_('\u934j\u29jd\u01ld\u9dk3')}</h1>
MakoRenderingException:

Traceback (most recent call last):
...
File "/mypath/myprj/templates/_detail_panel_a.html", line 5, in render_body
<h1>${_('\u934j\u29jd\u01ld\u9dk3')}</h1>
UnboundLocalError: local variable '_' referenced before assignment

我是这样注册_事件的:

myprj/myprj/subscribers.py

def add_renderer_globals(event):
    request = event['request']
    event['_'] = request.translate
    event['localizer'] = request.localizer

并在 __init__.py 文件中调用它:

myprj/myprj/__init__.py

config.add_subscriber('myprj.subscribers.add_renderer_globals', 'pyramid.events.BeforeRender')

我不知道为什么我使用渲染模板页面时它不起作用。我认为如果有必要定义 _ 事件,不仅 request.translate,而且还需要像 render 方法这样的东西。

但是我查了official document,我不知道怎么办。

怎么办?

你应该参考http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/templates/mako_i18n.html

应该可以帮你完成翻译。如您所见,您应该添加一个 tsf 全局变量(从上面资源中的第 11 行开始)。

您可能还想检查您使用 mako 呈现的模板,因为根据我的阅读,您正在将 mako 占位符放入 html 文件中。我推荐这个资源:http://docs.pylonsproject.org/projects/pyramid_mako/en/latest/

注意:如果您将 html 标签添加到您的消息字符串中,请使用 | n 过滤到你的 mako 占位符中,如 ${ | n}.

看看这些,如果您还有其他问题,我很乐意为您提供帮助,我刚刚在我的 Pyramid 应用程序上实现了国际化