2025-11-02 14:35:35 +03:00

56 lines
2.1 KiB
Python

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("/")