如何在Jinja模板中启用{% trans %}标签?

16

我试图启用trans标签,并且我已经创建了一个名为i18n.html的测试模板:

{% trans %}出售{% endtrans %}--{{message}}--{{decimal_format}} 这是我根据手册编写的Python代码:

from webapp2_extras import i18n as multilingua
import jinja2
from webapp2_extras.i18n import lazy_gettext as gettext
from webapp2_extras.i18n import lazy_gettext as _
from jinja2 import Environment, FileSystemLoader
jinja_environment =  jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
                      extensions=['jinja2.ext.i18n'])

# The code below seems wrong since it is django but it was the only way I could make the page load

jinja_environment.install_gettext_translations(django.utils.translation)

class HelloWorldHandler(webapp2.RequestHandler):
    def get(self):
        # Set the requested locale.
        locale = self.request.GET.get('locale', 'pt')
        multilingua.get_i18n().set_locale(locale)
        message = multilingua.gettext('For sale')
        #django.utils.translation.activate('pt')
        template = jinja_environment.get_template('templates/i18n.html')
    decimal_format = multilingua.I18n(self.request).format_decimal(1000)
        self.response.out.write(template.render(message=message, decimal_format=decimal_format))

我无法在没有Django的情况下使其正常工作,因此我想知道如何放弃Django翻译而改用webapp2.i18n + jinja。在一个帖子中也有讨论,我不是唯一发现文档不完整或难以找到的人。请回答或评论推荐使用trans标签的方式和为什么我必须包含jinja_environment.install_gettext_translations(django.utils.translation)

当我尝试删除我的Django使用时,我也失去了webapp2.i18n的功能。我的语言环境文件分别位于locale/...和conf/locale..中,因为前者是webapp2的默认值,而后者是Django翻译的默认值,因此我真的需要一些最佳实践指南来摆脱Django依赖,并使用webapp2和jinja来呈现我的本地化。

如果有帮助的话,当我尝试移除Django时,我收到了一个错误消息:

    self.response.out.write(template.render(message=message, decimal_format=decimal_format))
  File "/media/Lexar/montao/montaoproject/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "/media/Lexar/montao/montaoproject/templates/i18n.html", line 2, in top-level template code
    {{ _('For sale') }}--{{message}}--{{decimal_format}}
UndefinedError: 'gettext' is undefined
谢谢您。

我的jinja trans标签的未记录解决方案/变通方法:'from webapp2_extras import i18n' 'jinja_environment.install_gettext_translations(i18n)' - Niklas Rosencrantz
1
很有趣想知道您是如何发现这个未记录的解决方案/变通方法的。 - eyquem
1
对于阅读此内容的任何人,这是一份最新的指南,介绍如何在Google App Engine上启用Jinja2和i18n翻译。http://mikeshilkov.wordpress.com/2012/07/26/enable-jinja2-and-i18n-translations-on-google-appengine/ - Julian Suarez
在2016年,django-jinja包在处理此问题方面做得很好:http://niwinz.github.io/django-jinja/latest/#_i18n_support - BenjaminGolder
2个回答

11
请看Jinja2的i18n扩展文档。调用install_gettext_translations基本上设置了一个对象,Jinja2将通过该对象调用gettext、ngettext等函数,以便在遇到{% trans %}标记时翻译字符串。
由于这些函数定义在webapp2.i18n上(见此处),因此jinja2将成功调用这些函数来检索翻译,取决于您在请求内部调用set_locale的方式。我没有代码在手,但我猜想,在webapp2.i18n中定义的gettext和相关公司仅是代理,用于调用webapp.i18.get_i18n().gettext,这就是使所有这些工作的魔法。

10
这是一个Django+jinja2的工作示例:
from jinja2 import PackageLoader, Environment 
from django.utils import translation

...

jinja_environment = Environment(loader=PackageLoader('website', 'templates'),
                                extensions=['jinja2.ext.i18n'])

jinja_environment.install_gettext_translations(translation)

template = jinja_environment.get_template('test.jinja.html')

page_next_app_table = template.render()

...

In test.jinja.html:

<html>
<b> {{ _( "Traslate This" ) }}:</b>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接