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

17 投票
2 回答
18537 浏览
提问于 2025-04-17 08:12

我尝试启用 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

谢谢

2 个回答

11

这里有一个关于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()

在test.jinja.html文件中:

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

看看Jinja2的国际化扩展文档。调用install_gettext_translations基本上是设置一个对象,Jinja2会通过这个对象来调用gettext、ngettext等函数,以便在遇到{% trans %}标签时翻译字符串。

这些函数是在webapp2.i18n中定义的(可以在这里查看),所以Jinja2会根据你在请求中调用set_locale的情况,成功调用这些函数来获取翻译。我手头没有代码,但我猜webapp2.i18n中定义的gettext等函数只是用来调用webapp.i18.get_i18n().gettext的代理,这就是让这一切正常工作的魔法所在。

撰写回答