做 i18n 功能时如何在 Mako 模版引擎中使用下划线 _ ?

发布于 2022-09-02 01:05:27 字数 1568 浏览 20 评论 0

使用 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')

不知道为什么在 rendering 的页面中不好使。猜测可能是注册 _ 事件为 request.translate ,是不是也该定义包含一些例如 renderring 的方法的呢。

查看了官方文档,不知道怎么做。

如何做?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ぃ双果 2022-09-09 01:05:27

我的解决方案:

  1. 注册绑定 translator 到 requestconfig.add_request_method(_, '_')

  2. 在模板文件中使用 request._ 来获取翻译 <a href="/about">${request._(u'About')}</a>,同时 lingua 也能支持抽取这种类型的翻译token

我的完整 mako, pyramid i18n 方案介绍: http://www.vincentsfootprint....

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文