2014-02-04 5 views
0

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

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

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

ответ

3

Ваш заказ промежуточного слоя отличается от той recommended by the documentation:

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

Я изменил порядок, чтобы соответствовать этому, но при этом он не меняет отображаемый язык :( – Tusk

+0

1. Попробовали ли вы установить язык снова после того, как вы изменили заказ? 2. Используете ли вы Django 1.6 .1 или Django 1.6.0? –

+0

1. Несомненно. Я даже изменил LANGUAGE_CODE на «hu», и это ничего не изменит. 2. 1.6.1 – Tusk

1

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

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

0

Ладно, проблема было, что я поместил свою папку locale в корневой каталог, и он ожидает ее в установленном приложении.

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

Смежные вопросы