@MrCute
Студент

Как сменить язык пользователю на сайте 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'] стоит код языка, который мне надо.

Как сделать чтобы можно было самому выбрать язык?
  • Вопрос задан
  • 6592 просмотра
Решения вопроса 1
zenwalker
@zenwalker
0xABADBABE
Вместо 'django_language' используй константный LANGUAGE_SESSION_KEY из django.utils.translation. Думаю проблема в этом. Сейчас ты сохраняешь яызык в сессию под каким-то левым ключем. У LANGUAGE_SESSION_KEY не такое значение.

from django.utils.translation import LANGUAGE_SESSION_KEY

def select_lang(request, code):
    ...
    request.session[LANGUAGE_SESSION_KEY] = code
    ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы