Source code for ferrosoft.apps.ferrobase.middleware.language
from asgiref.sync import iscoroutinefunction, markcoroutinefunction
from django.utils import translation
[docs]
class UserLanguageMiddleware:
"""Middleware that activates the authenticated user's preferred language for each request.
Reads ``user.language.iso_code`` and calls ``django.utils.translation.activate``
so that all subsequent ``gettext`` calls in the request–response cycle use
the user's chosen locale. Unauthenticated or language-less users receive
Django's default language.
"""
async_capable = True
sync_capable = True
def __init__(self, get_response):
self.get_response = get_response
if iscoroutinefunction(self.get_response):
markcoroutinefunction(self)
async def __call__(self, request):
"""
Set current language to language preferred by user.
"""
await self._patch_request(request)
return await self.get_response(request)
@staticmethod
async def _patch_request(request):
user = await request.auser()
if user is None:
return
language = getattr(user, "language", None)
if language is not None:
translation.activate(language.iso_code)
request.LANGUAGE_CODE = translation.get_language()