多言語の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>
またi18n_patterns
、各オブジェクトのURLも言語固有であるように使用します。
これをJinjaに変換する方法に固執しています。Djangoのi18nテンプレートタグを使用できず、Jinjaに相当するものが見つかりません。
また、テンプレートからメッセージを抽出するのに役立つBabelも検討していました。そのため、DjangoだけでなくBabelでも機能するソリューションが推奨されます。
カスタム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をメッセージエクストラクターとして使用するdjango
場合、実行時にメッセージドメインをに設定するようにBabelに指示することが重要であるということinit/update/compile_catalog
です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加