from django.conf import settings from urllib.parse import urlparse, urlunparse import logging from django.shortcuts import redirect from django.utils import timezone, translation logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def switch_language(request): """ Switches the current language context for the user based on a request parameter, modifies the URL path accordingly, and updates session and cookies with the new language preference. :param request: The HTTP request object containing information about the user request, including the desired language to switch to and the referring URL. - "GET" dictionary is accessed to retrieve the desired language parameter. - "META" dictionary is used to extract the referring URL via "HTTP_REFERER". :return: A redirect response object pointing to the modified URL with the updated language preference, if the requested language is valid. Otherwise, redirects to the default URL. """ language = request.GET.get("language", "en") referer = request.META.get("HTTP_REFERER", "/") parsed_url = urlparse(referer) path_parts = parsed_url.path.split("/") if path_parts[1] in dict(settings.LANGUAGES): path_parts.pop(1) new_path = "/".join(path_parts) new_url = urlunparse( ( parsed_url.scheme, parsed_url.netloc, new_path, parsed_url.params, parsed_url.query, parsed_url.fragment, ) ) if language in dict(settings.LANGUAGES): logger.debug(f"Switching language to: {language}") response = redirect(new_url) response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language) translation.activate(language) request.session[settings.LANGUAGE_COOKIE_NAME] = language logger.debug( f"Language switched to: {language}, Session: {request.session[settings.LANGUAGE_COOKIE_NAME]}" ) return response else: logger.warning(f"Invalid language code: {language}") return redirect("/")