2017-07-03 27 views
7

私は、Djangoのテンプレートエンジンから複数の言語のDjangoアプリケーションをJinja2に移行しています。私は現在、すなわちDjango's language template tagを使用して、オブジェクトごとにアクティブな言語を切り替えるテンプレート:ジンジャーテンプレートの言語切り替え

{% 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> 

で我々はまた、その各オブジェクトのURLが同様の言語固有のものですi18n_patternsを使用しています。

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

私はまた、Babelを見て、テンプレートからメッセージを抽出するのを手伝っていました。だから、BabelとDjangoで動作するソリューションが望ましいでしょう。

+0

'django-jinja'アプリでどのように実装されているのを見ましたか? –

+0

[このdjango-jinja](https://github.com/niwinz/django-jinja)を意味すると思いますか?そこに 'language'テンプレートタグの実装が見つかりません。 – jaap3

+0

この構文を試してみましたか? http://jinja.pocoo.org/docs/2.9/templates/#i18n – HassenPy

答えて

3

をこれを使用することができますそれは(それがカスタムJinja2のエクステンションを書くことでこれを行うにはかなり簡単ですが判明私はこれをexample in the jinja2 docsに基づいています):

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) 

アクティブな翻訳言語を切り替える代わりに、この拡張機能は、まさにあなたがジャンゴにそれを行うだろうどのようにほとんどです:

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

唯一の注意点は、メッセージ抽出としてgettextのプロバイダとバベルとしてジャンゴを使用した場合、それが重要だということですinit/update/compile_catalogを実行しているときにBabelにメッセージドメインをdjangoに設定するよう指示します。

3

jinja2の言語を切り替えるためのコードスニペットがあります。 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', 
     ] 
    }, 
},] 

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 

、その後、あなたは、テンプレート内のどこに{{ _('Hello World') }}

関連する問題