在jinja模板中切换语言

jaa*_*ap3 6 django templates internationalization jinja2 babel

我正在将多语言Django应用程序从Django的模板引擎迁移到Jinja2.在模板中,我目前使用Django的language模板标签在每个对象的基础上切换活动语言,即:

{% load i18n %}
<h1>{% trans 'Page title' %}</h1>
<ul>
{% for obj in object_list %}
{% language obj.language_code %}
    <li><a href="{{ obj.get_absolute_url }}">{% trans 'view' %}: {{ obj.title }}</a>
{% endlanguage %}
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

我们也使用,i18n_patterns因此每个对象的URL也是特定于语言的.

我坚持如何将其转换为Jinja.我不能使用Django的i18n模板标签,也无法找到与Jinja等效的东西.

我也在看Babel来帮助从模板中提取消息.因此,首选适用于Babel和Django的解决方案.

jaa*_*ap3 3

事实证明,通过编写自定义 jinja2 扩展来做到这一点相当简单(我基于jinja2 文档中的示例):

from django.utils import translation
from jinja2.ext import Extension, nodes

class LanguageExtension(Extension):
    tags = {'language'}

    def parse(self, parser):
        lineno = next(parser.stream).lineno
        # Parse the language code argument
        args = [parser.parse_expression()]
        # Parse everything between the start and end tag:
        body = parser.parse_statements(['name:endlanguage'], drop_needle=True)
        # Call the _switch_language method with the given language code and body
        return nodes.CallBlock(self.call_method('_switch_language', args), [], [], body).set_lineno(lineno)

    def _switch_language(self, language_code, caller):
        with translation.override(language_code):
            # Temporarily override the active language and render the body
            output = caller()
        return output

# Add jinja2's i18n extension
env.add_extension('jinja2.ext.i18n')
# Install Django's translation module as the gettext provider
env.install_gettext_translations(translation, newstyle=True)
# Add the language extension to the jinja2 environment
environment.add_extension(LanguageExtension)
Run Code Online (Sandbox Code Playgroud)

使用此扩展后,切换活动翻译语言与在 Django 中执行此操作非常相似:

{% language 'en' %}{{ _('Hello World'){% endlanguage %}
Run Code Online (Sandbox Code Playgroud)

唯一需要注意的是,当使用 Django 作为 gettext 提供程序并使用 Babel 作为消息提取器时,告诉 Babel 在django运行时将消息域设置为 很重要init/update/compile_catalog