from django.utils.deprecation import MiddlewareMixin from django.utils import translation from django.http.request import HttpRequest from django.http.response import HttpResponse class LocaleMiddleware(MiddlewareMixin): """ LocaleMiddleware sets the translation language for each request. For authenticated users, it uses their preferred language setting from the database. For unauthenticated users, it uses the language from the request headers. Note: This middleware only works with session-based authentication (browser users). It does not support API-key authentication because Django REST Framework handles API-key authentication separately, making the user unavailable during middleware execution. This limitation is acceptable for now as we primarily need to support browser users. """ def process_request(self, request: HttpRequest) -> None: language = None if request.user and request.user.is_authenticated: language = request.user.language_code if not language: language = translation.get_language_from_request(request, check_path=False) translation.activate(language) request.LANGUAGE_CODE = translation.get_language() def process_response( self, request: HttpRequest, response: HttpResponse ) -> HttpResponse: language = translation.get_language() response.headers.setdefault("Content-Language", language) return response