Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Как сменить язык пользователю на сайте Django?

#python #django #локализация


Делаю возможность на сайте переключаться между русской, английской и украинской версией.
Обернул строки в шаблонах, которые надо перевести, в тег {% trans %}, строки в коде,
всё перевёл и скомпилировал перевод. Также установил locale_url.

В settings.py прописал:

LANGUAGE_CODE = 'Ru-ru'
LANGUAGES = (
('en', 'English'),
('ru', 'Russian'),
('uk', 'Ukrainian'),
)

TIME_ZONE = 'Europe/Kiev'
USE_I18N = True
USE_L10N = True
USE_TZ = True

LOCALE_PATHS = (
'locale',
 # os.path.join(BASE_DIR, 'locale'),
)


Переключать язык через POST, так как это делается в django.conf.urls.i18n мне не
захотелось, поэтому создал такое представление:

def select_lang(request, code):

go_next = request.META.get('HTTP_REFERER', '/')
response = HttpResponseRedirect(go_next)
if code and translation.check_for_language(code):
    if hasattr(request, 'session'):
        request.session['django_language'] = code
    else:
        response.set_cookie(settings.LANGUAGE_COOKIE_NAME, code)
    translation.activate(code)
return response


Перехожу в браузере на /lang/uk, страница перезагружается, а язык остаётся прежний.
Если вводить адрес /uk/about - страница переводится, но при переходе на другую язык
опять возвращается.

В чем проблема, подскажите, пожалуйста!

Вот мои middleware, может в них дело:

MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.locale.LocaleMiddleware',
]


P.S. язык сайта по дефолту русский, как и весь текст в коде и в шаблонах. Но у меня
по умолчанию отображается английский. Через заголовки запроса
"Accept-Language en-US,en;q=0.5"

P.S.S. функцию вьюхи проверял, на выходе у request.session['django_language'] стоит
код языка, который мне надо.
    


Ответы

Ответ 1



Нужно в метод добавить еще: request.session['_language'] = code В сессии django хранит 2 параметра: django_language и _language

Комментариев нет:

Отправить комментарий