from django.conf import settings
from django.utils import translation
from django.utils.cache import patch_vary_headers
[docs]class LocaleMiddleware(object):
"""
This is a very simple middleware that parses a request
and decides what translation object to install in the current
thread context depending on the selected language.
This also allows us to update the language cookie whenever our api endpoint is used.
"""
[docs] def get_language_for_user(self, request):
if request.user.is_authenticated() and hasattr(request.user, 'language'):
return getattr(request.user, 'language')
return translation.get_language_from_request(request)
[docs] def process_request(self, request):
if request.META.get('HTTP_ACCEPT_LANGUAGE', None) is not None:
del request.META['HTTP_ACCEPT_LANGUAGE']
translation.activate(self.get_language_for_user(request))
request.LANGUAGE_CODE = translation.get_language()
[docs] def process_response(self, request, response):
language = getattr(request, 'update_language_cookie', False)
if language:
if request.user.is_authenticated() and hasattr(request.user, 'language'):
language = getattr(request.user, 'language')
else:
language = language or request.LANGUAGE_CODE
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language,
max_age=settings.LANGUAGE_COOKIE_AGE,
path=settings.LANGUAGE_COOKIE_PATH,
domain=settings.LANGUAGE_COOKIE_DOMAIN)
patch_vary_headers(response, ("Accept-Language",))
response["Content-Language"] = translation.get_language()
translation.deactivate()
return response