2017-07-03 28 views
7

Tôi đang di chuyển ứng dụng Django đa ngôn ngữ từ công cụ mẫu của Django sang Jinja2. Trong các mẫu Tôi hiện chuyển đổi ngôn ngữ hoạt động trên một cơ sở cho mỗi đối tượng sử dụng Django's language template tag tức là .:Chuyển ngôn ngữ trong mẫu jinja

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

Chúng tôi cũng sử dụng i18n_patterns để các url của từng đối tượng là ngôn ngữ cụ thể là tốt.

Tôi đang mắc kẹt về cách chuyển đổi thành Jinja. Tôi không thể sử dụng thẻ mẫu i18n của Django và không thể tìm thấy thứ gì đó tương đương với Jinja.

Tôi cũng đang xem Babel để giúp trích xuất thư từ mẫu. Vì vậy, một giải pháp mà làm việc với Babel cũng như với Django sẽ được ưa thích.

+0

Bạn có thấy cách ứng dụng được triển khai trong ứng dụng 'django-jinja' không? –

+0

Tôi giả sử bạn có nghĩa là [django-jinja] này (https://github.com/niwinz/django-jinja)? Tôi không thể tìm thấy việc triển khai thẻ mẫu 'language' trong đó. – jaap3

+0

bạn đã thử cú pháp này chưa? http://jinja.pocoo.org/docs/2.9/templates/#i18n – HassenPy

Trả lời

3

Hóa ra nó là khá đơn giản để thực hiện điều này bằng cách viết một phần mở rộng tùy chỉnh jinja2 (Tôi đã dựa trên điều này trên 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) 

Với phần mở rộng này ở vị trí chuyển đổi ngôn ngữ dịch tích cực là khá nhiều chính xác giống như cách bạn muốn làm điều đó trong Django:

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

Thông báo trước duy nhất là khi sử dụng Django là nhà cung cấp gettext và Babel như một vắt nhắn điều quan trọng là để yêu cầu Babel đặt miền tin nhắn thành django khi chạy init/update/compile_catalog.

3

Tôi có đoạn mã này để chuyển đổi giữa các ngôn ngữ trong 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 

trong 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', 
     ] 
    }, 
},] 

và sau đó bạn có thể sử dụng ở bất cứ nơi nào trong các mẫu của bạn {{ _('Hello World') }}

Các vấn đề liên quan