Django: смена текущего языка
Как быть, если нужно сменить язык "на лету", например, в зависимости от раздела сайта?
Это нужно для много-языковых сайтов, когда контент доступен на разных языках и могут быть сквозные ссылки между материалами. Нужно, чтобы при переходе так же переключался язык и интерфейса, который "зашит" в шаблонах.
В документации описано, как Django определяет текущий язык. Сказано, что за это отвечает в том числе django.middleware.locale.LocaleMiddleware.
Когда нужна собственная логика переключения языка, в зависимости от раздела, то этого уже не достаточно. Нужна замена "автоматического" переключения на "ручное".
Из документации известно, что первым делом текущая настройка языка ищется в сесии. Из этого получается простое решение:
- сохранить в
request.sessionнужное значениеdjango_language
- проделать то же, что делает
LocaleMiddleware
Пример класса middleware, который переключает текущий язык по параметру language в GET-запросе:
from django.middleware.locale import LocaleMiddleware
from django.utils import translation
class SwitchLocaleMiddleware(LocaleMiddleware):
def process_request(self, request):
if 'language' in request.GET:
request.session['django_language'] = request.GET['language']
language = translation.get_language_from_request(request)
translation.activate(language)
request.LANGUAGE_CODE = languageТеперь, если включить SwitchLocaleMiddleware, то можно переключать текущий язык сайта, указывая в адресе, например ?language=ru.