5

我正在使用 Django 1.6,我觉得我错过了一些东西,但是 cookie 设置为当前选择的语言,但显示语言保持默认。

对应代码:

设置.py

LANGUAGES = (
    ('hu', 'Hungarian'),
    ('en', 'English'),
)

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.core.context_processors.tz",
    "django.contrib.messages.context_processors.messages",
    "django.core.context_processors.request"
)

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.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware'
)
LANGUAGE_CODE = 'en-US'
TIME_ZONE = 'CET'
USE_I18N = True
USE_L10N = True
USE_TZ = True

网址.py

urlpatterns = patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
    ...
)

模板

{% extends 'base.html' %}
{% load i18n %}
...
<h4>{% trans "Modern Technologies" %}</h4>
...

我运行makemessages -a来创建 lang 文件,安装 Rosetta 并编辑语言。然后我运行了compilemessages。在 Chrome 中检查 cookie “django_language” 的设置是否正确。但实际文本仍然是默认的“现代技术”。

4

3 回答 3

9

您的中间件顺序与文档推荐的顺序不同:

要使用 LocaleMiddleware,请将“django.middleware.locale.LocaleMiddleware”添加到您的 MIDDLEWARE_CLASSES 设置中。因为中间件顺序很重要,所以您应该遵循以下准则:

  • 确保它是第一个安装的中间件之一。
  • 它应该在 SessionMiddleware 之后,因为 LocaleMiddleware 使用会话数据。它也应该出现在 CommonMiddleware 之前,因为 CommonMiddleware 需要一种激活的语言来解析请求的 URL。
  • 如果您使用 CacheMiddleware,请将 LocaleMiddleware 放在其后面。

所以你的中间件配置应该是这样的:

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.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

您还需要记住在设置文件中包含LOCALE_PATHS设置:

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)
于 2014-02-04T13:00:34.767 回答
2

好的,问题是,我已将我的语言环境文件夹放入根目录,并且它希望它位于已安装的应用程序中。

但是,即使您在应用程序之外有翻译,rosetta 也会找到它。

于 2014-02-05T10:35:16.850 回答
1

尝试在和'django.middleware.locale.LocaleMiddleware',之间插入。SessionMiddlewareCommonMiddleware

正如它在文档中所做的那样。如果我没记错的话,这很重要。

于 2014-02-04T12:59:59.210 回答