2017-07-03 19 views
7

मैं Django के टेम्पलेट इंजन से Jinja2 तक एक बहुभाषी Django एप्लिकेशन माइग्रेट कर रहा हूं। टेम्पलेट्स में मैं वर्तमान में एक वस्तु प्रति आधार 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> 

पर सक्रिय भाषा स्विच हम यह भी का उपयोग i18n_patterns तो प्रत्येक वस्तु के यूआरएल के साथ-साथ विशिष्ट भाषा है।

मैं इसे जिन्जा में परिवर्तित करने के तरीके पर फंस गया हूं। मैं Django के i18n टेम्पलेट टैग का उपयोग नहीं कर सकता और Jinja के लिए कुछ समकक्ष नहीं मिल सकता है।

मैं टेम्पलेट्स से संदेशों को निकालने में सहायता के लिए Babel पर भी देख रहा था। तो एक समाधान जो बेबेल के साथ-साथ Django के साथ काम करता है उसे प्राथमिकता दी जाएगी।

+0

क्या आप देखते हैं कि यह 'django-jinja' ऐप में कैसे कार्यान्वित किया गया है? –

+0

मुझे लगता है कि आपका मतलब है [यह django-jinja] (https://github.com/niwinz/django-jinja)? मुझे वहां 'भाषा' टेम्पलेट टैग का कार्यान्वयन नहीं मिल रहा है। – 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) 

साथ जगह में इस विस्तार सक्रिय अनुवाद भाषा स्विचिंग काफी है वास्तव में चाहते कि कैसे आप Django में ऐसा चाहते हैं:

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

केवल चेतावनी है कि यह महत्वपूर्ण है जब एक gettext प्रदाता और कोलाहल संदेश निकालने के रूप में के रूप में Django उपयोग कर रहा है init/update/compile_catalog चलाते समय संदेश को डोमेन को django पर सेट करने के लिए कहें।

3

मेरे पास जिन्जा 2 में भाषाओं के बीच स्विच करने के लिए यह कोड स्निपेट है।

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 
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') }}

संबंधित मुद्दे