Django-jinja jinja2模板i18n没有翻译

时间:2016-07-26 11:55:19

标签: django python-3.x templates internationalization jinja2

我的Django项目有问题,我使用Jinja2作为模板引擎;特别是使用django-jinja"提供不引人注目的Jinja2支持" :(。 我的问题是模板中的字符串没有翻译。 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

1 个答案:

答案 0 :(得分:1)

事实证明我需要指定LOCALE_PATHS

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

我以某种方式假设,他们被设置为&#34; locale&#34;默认情况下(因为我在Unable to find a locale path to store translations for file __init__.py中读到了这一点。)

这就是为什么它没有翻译我的字符串。单词&#34;英语&#34;和&#34;德语&#34;仍被翻译,因为django在$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)

中有一个后备区域