Как работает django locale между представлениями - PullRequest
3 голосов
/ 31 августа 2011

Я знаю, что 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?

Ответы [ 3 ]

5 голосов
/ 07 сентября 2011

Предложение / ответ:

У меня тоже странное поведение!Поскольку я забыл добавить «LocaleMiddleware», дважды проверьте, есть ли он, для иллюстрации вот как выглядит мой «MIDDLEWARE_CLASSES»:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

Это Middleware отвечает за обработку вашего запроса и ответа,и добавьте язык!

Также сохраните код от 'Sindri Guðmundsson', который меняет язык!

РЕДАКТИРОВАТЬ

Немногов дальнейшем!Если мы посмотрим на LocaleMiddleware:

def process_request(self, request):
    language = translation.get_language_from_request(request)
    translation.activate(language)
    request.LANGUAGE_CODE = translation.get_language()

Так что вопрос!зачем Джанго это нужно ?!ответ: потому что если вы используете {{LANGUAGE_CODE}}, он читает из REQUEST, поэтому LANGUAGE_CODE должен быть в запросе!иначе !это не собирается возвращать это!вот почему существует это промежуточное ПО!Проверьте это в комментарии, в фактическом исходном коде промежуточного программного обеспечения:

"""
This is a very simple middleware that parses a request
and decides what translation object to install in the current
thread context. This allows pages to be dynamically
translated to the language the user desires (if the language
is available, of course).
"""

Также проверьте документы: https://docs.djangoproject.com/en/1.3/topics/i18n/deployment/#how-django-discovers-language-preference

1 голос
/ 31 августа 2011

Выезд set_language в django.views.i18n, строка 33. Необходимо установить код языка для пользователя в сеансе:

if hasattr(request, 'session'):
    request.session['django_language'] = lang_code
else:
    response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
0 голосов
/ 07 сентября 2011

Django CMS использует request.LANGUAGE_CODE, чтобы определить, какой язык использовать, если вы специально не запрашиваете определенный язык в параметрах GET или POST.

Django CMS использует промежуточное ПО, MultilingualURLMiddleware, для установкиrequest.LANGUAGE_CODE.

Это промежуточное ПО сначала ищет языковой префикс в URL-адресе, а затем ищет язык сеансового ключа.

Это означает, что если вам нужен другой язык, вы можете установить его впеременная сеанса один раз, но MultilingualURLMiddleware по-прежнему будет устанавливать request.LANGUAGE_CODE при каждом запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...