Django: смена текущего языка

Как быть, если нужно сменить язык "на лету", например, в зависимости от раздела сайта?

Это нужно для много-языковых сайтов, когда контент доступен на разных языках и могут быть сквозные ссылки между материалами. Нужно, чтобы при переходе так же переключался язык и интерфейса, который "зашит" в шаблонах.

В документации описано, как Django определяет текущий язык. Сказано, что за это отвечает в том числе django.middleware.locale.LocaleMiddleware.

Когда нужна собственная логика переключения языка, в зависимости от раздела, то этого уже не достаточно. Нужна замена "автоматического" переключения на "ручное".

Из документации известно, что первым делом текущая настройка языка ищется в сесии. Из этого получается простое решение:

  1. сохранить в request.session нужное значение django_language
  2. проделать то же, что делает 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.