Как мне узнать, почему Django игнорирует заголовок Accept-Language? - PullRequest
3 голосов
/ 02 ноября 2009

У меня есть приложение Django (на Google App Engine), которое я хочу интернационализировать.

settings.py:

USE_I18N = True
LANGUAGE_CODE = 'en'

# Restrict supported languages (and JS media generation)
LANGUAGES = (
  ('en', 'English'),
  ('fr', 'French'),
)

MIDDLEWARE_CLASSES = (
  'ragendja.middleware.ErrorMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  # i18n
  'django.middleware.locale.LocaleMiddleware',
  ...

Я сгенерировал файлы .po и .mo для своего приложения в locale / fr / LC_MESSAGES (хотя и не на глобальном уровне).

Я установил в браузере заголовок Accept-Language на "fr", а Django его игнорирует. Когда я смотрю на request.LANGUAGE_CODE, это всегда "en".

Я могу сказать, что браузер работает правильно, потому что я захожу на другой сайт, поддерживающий i18n, и он возвращает французский язык.

Как мне найти то, что, по мнению Django, отсутствует в моей настройке?

Я видел этот вопрос , и он мне не помог.

Я запускаю Django 1.0 с помощью патча движка приложения 1.0.2.2 в Google App Engine.

Ответы [ 2 ]

3 голосов
/ 03 ноября 2009

Есть определенный порядок, в котором Джанго действует в терминах i18n.

Сначала проверяется LANGUAGE_CODE. Это язык всего сайта, и если ничего не установлено, это язык, который получает пользователь.

Во-вторых, поскольку вы добавили LocaleMiddleware, он проверяет, установлен ли django_language в сеансе пользователя. Я бы предложил очистить информацию о сеансе в БД или создать совершенно нового пользователя, с которым можно попробовать.

В-третьих, он проверяет, есть ли набор файлов cookie django_language (или, собственно, имя файла cookie определяется LANGUAGE_COOKIE_NAME). Я бы предложил удалить этот файл cookie.

В-четвертых, он ищет заголовок HTTP Accept-Language. Именно здесь вступают в настройку вашего браузера.

Удачи!

0 голосов
/ 17 июня 2019

Взято с этой страницы , вы можете удалить HTTP_ACCEPT_LANGUAGE из запроса и вернуться к LocaleMiddleware:

class ForceDefaultLanguageMiddleware(object):
    """
    Ignore Accept-Language HTTP headers

    This will force the I18N machinery to always choose settings.LANGUAGE_CODE
    as the default initial language, unless another one is set via sessions or cookies

    Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'],
    namely django.middleware.locale.LocaleMiddleware
    """

    def process_request(self, request):
        if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
            del request.META['HTTP_ACCEPT_LANGUAGE']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...