2016-07-26 162 views
0

我的Django項目有問題,我使用Jinja2作爲模板引擎;特別是使用django-jinja「提供不顯眼的Jinja2支持」:(我的問題是模板中的字符串沒有被翻譯,Django識別正確的語言,這也可以通過使用/ i18n/setlang視圖來設置。Django-jinja jinja2模板i18n不是翻譯

什麼奇怪的是,在Python中定義的字符串進行翻譯:

# 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 

我有位於locale/de/LC_MESSAGES/django.po與相應django.mo一個django.po

#: 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" 

在我的呈現模板,正確的語言被使用(LANGUAGE_CODE是正確的)和

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"! 

- >所以這些都是正確的翻譯,但About仍然About而不是Über,雖然在模板about.jinja我用

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

我中間件是:

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", 
) 

而且我的模板defini重刑是:

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", 
      ], 
     }, 
    }, 
] 

我使用Python 3,Django的1.9.8和Django的神社2.2.0

回答

0

原來,我需要指定LOCALE_PATHS

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

我莫名其妙假設他們默認設置爲「locale」(因爲我在Unable to find a locale path to store translations for file __init__.py中讀到了這個)。

所以這就是爲什麼它沒有翻譯我的字符串。 「英語」和「德語」這兩個詞仍然被翻譯,因爲django在$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)