From 0e444e84f87d174713a2aef0c4f9704ce2865586 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 28 Apr 2023 08:05:43 +0200 Subject: Fixed #34515 -- Made LocaleMiddleware prefer language from paths when i18n patterns are used. Regression in 94e7f471c4edef845a4fe5e3160132997b4cca81. This reverts commit 94e7f471c4edef845a4fe5e3160132997b4cca81 (refs #34069) and partly reverts commit 3b4728310a7a64f8fcc548163b0aa5f98a5c78f5. Thanks Anthony Baillard for the report. Co-Authored-By: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> --- django/middleware/locale.py | 33 ++++++++++++--------------------- django/urls/resolvers.py | 5 ++--- django/utils/translation/__init__.py | 1 - django/utils/translation/trans_null.py | 2 +- django/utils/translation/trans_real.py | 6 +++++- 5 files changed, 20 insertions(+), 27 deletions(-) (limited to 'django') diff --git a/django/middleware/locale.py b/django/middleware/locale.py index bc1d862574..71db230da2 100644 --- a/django/middleware/locale.py +++ b/django/middleware/locale.py @@ -16,37 +16,28 @@ class LocaleMiddleware(MiddlewareMixin): response_redirect_class = HttpResponseRedirect - def get_fallback_language(self, request): - """ - Return the fallback language for the current request based on the - settings. If LANGUAGE_CODE is a variant not included in the supported - languages, get_fallback_language() will try to fallback to a supported - generic variant. - - Can be overridden to have a fallback language depending on the request, - e.g. based on top level domain. - """ - try: - return translation.get_supported_language_variant(settings.LANGUAGE_CODE) - except LookupError: - return settings.LANGUAGE_CODE - def process_request(self, request): urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF) - i18n_patterns_used, _ = is_language_prefix_patterns_used(urlconf) + ( + i18n_patterns_used, + prefixed_default_language, + ) = is_language_prefix_patterns_used(urlconf) language = translation.get_language_from_request( request, check_path=i18n_patterns_used ) - if not language: - language = self.get_fallback_language(request) - + language_from_path = translation.get_language_from_path(request.path_info) + if ( + not language_from_path + and i18n_patterns_used + and not prefixed_default_language + ): + language = settings.LANGUAGE_CODE translation.activate(language) request.LANGUAGE_CODE = translation.get_language() def process_response(self, request, response): language = translation.get_language() language_from_path = translation.get_language_from_path(request.path_info) - language_from_request = translation.get_language_from_request(request) urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF) ( i18n_patterns_used, @@ -57,7 +48,7 @@ class LocaleMiddleware(MiddlewareMixin): response.status_code == 404 and not language_from_path and i18n_patterns_used - and (prefixed_default_language or language_from_request) + and prefixed_default_language ): # Maybe the language code is missing in the URL? Try adding the # language prefix and redirecting to that URL. diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py index 658a6a6f97..b021673772 100644 --- a/django/urls/resolvers.py +++ b/django/urls/resolvers.py @@ -23,7 +23,7 @@ from django.utils.datastructures import MultiValueDict from django.utils.functional import cached_property from django.utils.http import RFC3986_SUBDELIMS, escape_leading_slashes from django.utils.regex_helper import _lazy_re_compile, normalize -from django.utils.translation import get_language, get_supported_language_variant +from django.utils.translation import get_language from .converters import get_converter from .exceptions import NoReverseMatch, Resolver404 @@ -351,8 +351,7 @@ class LocalePrefixPattern: @property def language_prefix(self): language_code = get_language() or settings.LANGUAGE_CODE - default_language = get_supported_language_variant(settings.LANGUAGE_CODE) - if language_code == default_language and not self.prefix_default_language: + if language_code == settings.LANGUAGE_CODE and not self.prefix_default_language: return "" else: return "%s/" % language_code diff --git a/django/utils/translation/__init__.py b/django/utils/translation/__init__.py index 69820a2fc4..0b3f78e486 100644 --- a/django/utils/translation/__init__.py +++ b/django/utils/translation/__init__.py @@ -17,7 +17,6 @@ __all__ = [ "get_language_from_request", "get_language_info", "get_language_bidi", - "get_supported_language_variant", "check_for_language", "to_language", "to_locale", diff --git a/django/utils/translation/trans_null.py b/django/utils/translation/trans_null.py index 595a705e2b..c8bfb1256e 100644 --- a/django/utils/translation/trans_null.py +++ b/django/utils/translation/trans_null.py @@ -53,7 +53,7 @@ def check_for_language(x): def get_language_from_request(request, check_path=False): - return None + return settings.LANGUAGE_CODE def get_language_from_path(request): diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py index 46a94b99ff..872c80b00f 100644 --- a/django/utils/translation/trans_real.py +++ b/django/utils/translation/trans_real.py @@ -583,7 +583,11 @@ def get_language_from_request(request, check_path=False): return get_supported_language_variant(accept_lang) except LookupError: continue - return None + + try: + return get_supported_language_variant(settings.LANGUAGE_CODE) + except LookupError: + return settings.LANGUAGE_CODE @functools.lru_cache(maxsize=1000) -- cgit v1.2.1