Django-jinja jinja2 模板 i18n 不翻译

Django-jinja jinja2 templates i18n not translating

我的 Django 项目有问题,我使用 Jinja2 作为模板引擎;特别是使用 django-jinja "providing unobtrusive Jinja2 support" :(。 我的问题是模板中的字符串没有被翻译。 Django 识别正确的语言,也可以使用 /i18n/setlang 视图进行设置。

奇怪的是 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

我有一个 django.po 位于 locale/de/LC_MESSAGES/django.po 和相应的 django.mo:

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

我的模板定义是:

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-jinja 2.2.0

原来我需要指定LOCALE_PATHS:

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

我以某种方式假定它们默认设置为 "locale"(因为我在 Unable to find a locale path to store translations for file __init__.py 中阅读过)。

所以这就是它没有翻译我的字符串的原因。 "English" 和 "German" 这两个词仍然被翻译,因为 django 在 $PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)

中有一个后备语言环境