2016-07-26 14 views
0

Ich habe ein Problem mit meinem Django-Projekt, ich benutze Jinja2 als Vorlage-Engine; speziell mit django-jinja "bietet unaufdringliche Jinja2-Unterstützung" :(. Mein Problem ist, dass die Zeichenfolgen in der Vorlage nicht übersetzt werden. Django erkennt die richtige Sprache, die auch mithilfe der/i18n/setlang-Ansicht festgelegt werden kann.Django-jinja jinja2 Vorlagen i18n nicht übersetzen

Was seltsam ist, dass die Strings in Python definiert übersetzt:

# in settings/base.py 
from django.utils.translation import ugettext_lazy as _ 

LANGUAGES = (
    ('en', _('English')), 
    ('de', _('German')), 
) 

LANGUAGE_CODE = "en" 
TIME_ZONE = "UTC" 
USE_I18N = True 
USE_L10N = True 

ich habe einen django.po liegt in locale/de/LC_MESSAGES/django.po mit einem django.mo entsprechen:

#: PyLatein/settings/base.py:144 
msgid "English" 
msgstr "Englisch" 

#: PyLatein/settings/base.py:145 
msgid "German" 
msgstr "Deutsch" 

#: templates/about.jinja:9 
msgid "About" 
msgstr "Über" 

In meiner gerenderten Vorlage, die richtige Sprache verwendet wird (LANGUAGE_CODE ist korrekt) und

if the language is en, then I can choose between "English" and "German", 
if the language is de, then I can choose between "Englisch" and "Deutsch"! 

-> so richtig übersetzt diejenigen sind, aber About ist noch About und nicht Über, obwohl in der Vorlage about.jinja I

verwendet
<h1 class="page-header">{{ _('About') }}</h1> 

Meine Middle sind:

MIDDLEWARE_CLASSES = (
    "django.contrib.sessions.middleware.SessionMiddleware", 
    "django.middleware.locale.LocaleMiddleware", 
    "django.middleware.common.CommonMiddleware", 
    "django.middleware.csrf.CsrfViewMiddleware", 
    "django.contrib.auth.middleware.AuthenticationMiddleware", 
    "django.contrib.auth.middleware.SessionAuthenticationMiddleware", 
    "django.contrib.messages.middleware.MessageMiddleware", 
    "django.middleware.clickjacking.XFrameOptionsMiddleware", 
    "django.middleware.security.SecurityMiddleware", 
) 

Und meine Vorlage defini tion ist:

TEMPLATES = [ 
    { 
     "BACKEND": "django_jinja.backend.Jinja2", 
     "DIRS": [osp.join(BASE_DIR, "templates")], 
     "APP_DIRS": True, 
     "OPTIONS": { 
      "match_extension": ".jinja", 
      "context_processors": [ 
       "django.template.context_processors.debug", 
       "django.template.context_processors.request", 
       "django.contrib.auth.context_processors.auth", 
       "django.contrib.messages.context_processors.messages", 
       "django.template.context_processors.i18n", 
      ], 
      "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", 
      ], 
      "constants": { 
       "settings": settings, 
      }, 
      "translation_engine": "django.utils.translation", 
     } 
    }, 
    { 
     "BACKEND": "django.template.backends.django.DjangoTemplates", 
     "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", 
      ], 
     }, 
    }, 
] 

ich Python 3, Django 1.9.8 und django-jinja 2.2.0

Antwort

0

Es stellte sich heraus, dass ich die LOCALE_PATHS angeben benötigt:

LOCALE_PATHS = (
    osp.join(BASE_DIR, "locale"), 
) 

ich irgendwie angenommen, dass sie standardmäßig auf "locale" eingestellt waren (weil ich das in Unable to find a locale path to store translations for file __init__.py gelesen habe).

Deshalb hat es meine Saiten nicht übersetzt. Die Wörter "Englisch" und "Deutsch" wurden noch übersetzt, weil django einen Fallback-Locale in $PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)

hat