Смена языка в Django не работает

Я использую Django 1.6, и я чувствую, что что-то упустил, но куки-файлы настроены на текущий выбранный язык, но язык отображения остается по умолчанию.

Соответствующий код:

settings.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

urls.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 установлена ​​и языки отредактированы. Затем я запустил компиляцию сообщений. При проверке в Chrome файл cookie "django_language" устанавливается правильно. Но фактический текст по-прежнему по умолчанию "Современные технологии".

3 ответа

Решение

Ваш заказ промежуточного программного обеспечения отличается от рекомендованного в документации:

Чтобы использовать 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'),
)

Хорошо, проблема была в том, что я поместил мою папку локали в root, и она ожидает ее в установленном приложении.

Однако Розетта находит это, даже если у вас есть перевод вне приложения.

Попробуй вставить 'django.middleware.locale.LocaleMiddleware', между SessionMiddleware а также CommonMiddleware,

Как это делается в документах. Если я не ошибаюсь, это важно.

Другие вопросы по тегам