/ / jinjaテンプレートの言語切り替え - django、テンプレート、国際化、jinja2、babel

ジンジャーテンプレートの切り替え言語 - django、テンプレート、国際化、jinja2、babel

私は、多言語のDjangoアプリケーションをDjangoのテンプレートエンジンからJinja2に移行しています。テンプレートでは、現在、オブジェクト単位でアクティブな言語を切り替えています Django "s 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>

我々はまた、 i18n_patterns 各オブジェクトのURLも言語固有のものです。

私はこれをJinjaに変換する方法に固執しました。私はDjangoのi18nテンプレートタグを使用することはできず、Jinjaに相当するものは見つかりませんでした。

私も見ていた バベル テンプレートからメッセージを抽出するのに役立ちます。だから、BabelとDjangoで動作するソリューションが望ましいでしょう。

回答:

回答№1は2

jinja2の言語を切り替えるためのコードスニペットがあります。

def change_lang(request, lang=None, *args, **kwargs):
"""
Get active page"s url by a specified language, it activates
Usage: {{ change_lang(request, "en") }}
"""

path = request.path
url_parts = resolve(path)

url = path
cur_language = get_language()
try:
activate(lang)
url = reverse(url_parts.view_name, kwargs=url_parts.kwargs)
finally:
activate(cur_language)

return "%s" % url

in settings.py

TEMPLATES = [
{
"BACKEND": "django_jinja.backend.Jinja2",
"DIRS": [
os.path.join(BASE_DIR, "templates/jinja"),
],
"OPTIONS": {
# Match the template names ending in .html but not the ones in the admin folder.
"match_extension": ".html",
"match_regex": r"^(?!admin/).*",
"newstyle_gettext": True,
"extensions": [
"jinja2.ext.do",
"jinja2.ext.loopcontrols",
"jinja2.ext.with_",
"jinja2.ext.i18n",
"jinja2.ext.autoescape",
"django_jinja.builtins.extensions.CsrfExtension",
"django_jinja.builtins.extensions.CacheExtension",
"django_jinja.builtins.extensions.TimezoneExtension",
"django_jinja.builtins.extensions.UrlsExtension",
"django_jinja.builtins.extensions.StaticFilesExtension",
"django_jinja.builtins.extensions.DjangoFiltersExtension",
],
"globals": {
"change_lang": "drug.utils.change_lang"
},
"bytecode_cache": {
"name": "default",
"backend": "django_jinja.cache.BytecodeCache",
"enabled": False,
},
"autoescape": True,
"auto_reload": DEBUG,
"translation_engine": "django.utils.translation",
"context_processors": [
"dashboard.context_processors.auth",
# "django.template.context_processors.debug",
"django.template.context_processors.i18n",
# "django.template.context_processors.media",
# "django.template.context_processors.static",
# "django.template.context_processors.tz",
"django.contrib.messages.context_processors.messages",
]
}
},
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
os.path.join(BASE_DIR, "templates"),
],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
]
},
},]

これをテンプレートのどこでも使用することができます {{ _("Hello World") }}


回答№2については2

カスタム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)

この拡張機能を有効にすると、アクティブな翻訳言語はDjangoでどのように "

{% language "en" %}{{ _("Hello World"){% endlanguage %}

唯一の注意点は、Djangoをgettextプロバイダとして使用し、Babelをメッセージ抽出プログラムとして使用する場合、Babelにメッセージドメインを次のように設定するように伝えることが重要です django 走っているとき init/update/compile_catalog.