如何在带有 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 应用程序上实现了国际化
现在我正在使用金字塔框架和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 应用程序上实现了国际化