Я знаю, что django сначала выбирает язык по умолчанию для веб-сайта из заголовков браузера, а затем отображает страницу на этом языке, если она соответствует возможному выбору из настроек.
Что я пытаюсь сделать, это изменить и установить этот язык после того, как пользователь вошел в систему.Я предоставил пользователям форму для настроек по умолчанию.При входе в систему выбран язык по умолчанию из этих defaultSettings
моделей.И то, что я делаю, это:
d = DefaultSettings.objects.filter(user = request.user)
if len(d) > 0 and d[0].has_default_language:
from django.utils import translation
translation.activate(d[0].default_language)
request.LANGUAGE_CODE = translation.get_language()
И то, что я вижу, это страница на «неправильном» языке.
Что заставляет меня спрашивать -Почему?Я не сделал этот код самостоятельно.Я получил его из следующих примеров
Поскольку все эти примеры изменяют запрос / ответ в middleware
- действительно ли я должен делать то же самое?Django
сбрасывает язык между запросами и пытается "угадать" его снова после каждого запроса?
Почему не работает мой способ его установки один раз?
Alan
Обновление после 1-го ответа (от Синдри Гудмундссона):
if form.is_valid ( ):
if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
redirect_to = settings.LOGIN_REDIRECT_URL
if not form.cleaned_data [ 'remember_me' ]:
request.session.set_expiry ( 0 )
from django.contrib.auth import login
login ( request, form.get_user ( ) )
if request.session.test_cookie_worked ( ):
request.session.delete_test_cookie ( )
set_lang_to_user_default_language(request)
response = HttpResponseRedirect ( redirect_to )
d = DefaultSettings.objects.filter(user = request.user)
if len(d) > 0 and d[0].has_default_language:
from django.utils import translation
translation.activate(d[0].default_language)
logger.debug(translation.get_language())
request.LANGUAGE_CODE = translation.get_language()
if hasattr(request, 'session'):
logger.debug('set django_language')
request.session['django_language'] = translation.get_language()
else:
logger.debug('set response cookie')
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, translation.get_language())
return response
Когда я проверяю журнал, я вижу:
DEBUG 2011-09-01 09:08:13,379 et
DEBUG 2011-09-01 09:08:13,379 set django_language
Но когда я проверяю шаблон в следующем представлении, где у меня есть {{ LANGUAGE_CODE }}
распечатывается, затем отображается 'en' not 'et'
Update2:
Фактически, что происходит после обработки этого представления: 1-я страница, где это представление перенаправляется на {{LANGUAGE_CODE}}Контент 'en' на 2-й странице английского языка, где я иду после 1-го {{ LANGUAGE_CODE }}
- это 'en', но контент на 3-й странице эстонского языка, где я иду после 2-го {{LANGUAGE_CODE}} - "en", а контент снова на английском и остаетсяАнглийский оттуда.
Похоже, я должен создать свой собственный middleware
, чтобы сохранить страницу на "правильном" языке ... хотя мой вопрос - ПОЧЕМУ?
Update3: Myязыковые настройки такие:
LANGUAGES = (
('et', gettext('Estonian')),
('en', gettext('English')),
('ru', gettext('Russian')),
('lv', gettext('Latvian')),
('lt', gettext('Lithuanian')),
('fi', gettext('Finnish')),
)
но после дальнейших вложенийЯ думаю, что нашел решение.В этом проекте я использую django-cms
и отключил cms.middleware.multilingual.MultilingualURLMiddleware и столкнулся с проблемами, описанными выше.Когда я снова включаю его, то все работает просто отлично - но работает просто отлично, потому что middleware
включено, и оно помещает необходимые параметры в каждый ответ.
То, что я изначально задавал с моим вопросомбыло- как это работает.И я задал вопрос ПОЧЕМУ позже.Теперь, я думаю, вопрос в том - нужно ли устанавливать язык для каждого request/response
так, как это делает middleware
и как пример middlewares
?