Merge pull request 'fix(#225): honor Accept-Language q-values in backend locale resolver' (#264) from dev/issue-225-backend-i18n-resolver-qweight into main
All checks were successful
CI / test-and-quality (push) Successful in 2m42s
All checks were successful
CI / test-and-quality (push) Successful in 2m42s
This commit was merged in pull request #264.
This commit is contained in:
@@ -39,15 +39,22 @@ def resolve_locale(request: HttpRequest) -> str:
|
|||||||
default_locale, supported_locales = i18n_locale_config()
|
default_locale, supported_locales = i18n_locale_config()
|
||||||
|
|
||||||
accept_language = request.META.get("HTTP_ACCEPT_LANGUAGE") or ""
|
accept_language = request.META.get("HTTP_ACCEPT_LANGUAGE") or ""
|
||||||
for candidate in accept_language.split(","):
|
ranked_candidates: list[tuple[float, int, str]] = []
|
||||||
|
for index, candidate in enumerate(accept_language.split(",")):
|
||||||
quality = _quality_value(candidate)
|
quality = _quality_value(candidate)
|
||||||
if quality is not None and quality <= 0:
|
if quality is not None and quality <= 0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
tag = candidate.split(";", 1)[0]
|
tag = candidate.split(";", 1)[0]
|
||||||
normalized = tag.strip().replace("_", "-").split("-", 1)[0].lower()
|
normalized = tag.strip().replace("_", "-").split("-", 1)[0].lower()
|
||||||
if normalized in supported_locales:
|
if normalized not in supported_locales:
|
||||||
return normalized
|
continue
|
||||||
|
|
||||||
|
ranked_candidates.append((quality if quality is not None else 1.0, index, normalized))
|
||||||
|
|
||||||
|
if ranked_candidates:
|
||||||
|
ranked_candidates.sort(key=lambda entry: (-entry[0], entry[1]))
|
||||||
|
return ranked_candidates[0][2]
|
||||||
|
|
||||||
requested = (get_language_from_request(request) or "").replace("_", "-").split("-", 1)[0].lower()
|
requested = (get_language_from_request(request) or "").replace("_", "-").split("-", 1)[0].lower()
|
||||||
if requested in supported_locales:
|
if requested in supported_locales:
|
||||||
|
|||||||
@@ -1300,7 +1300,7 @@ class I18nResolverTests(TestCase):
|
|||||||
self.assertEqual(response.status_code, 400)
|
self.assertEqual(response.status_code, 400)
|
||||||
self.assertEqual(resolve_locale(response.wsgi_request), "en")
|
self.assertEqual(resolve_locale(response.wsgi_request), "en")
|
||||||
|
|
||||||
def test_resolve_locale_keeps_q08_languages_eligible_in_accept_language_loop(self):
|
def test_resolve_locale_prefers_highest_quality_supported_language(self):
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
reverse("lobby:join_session"),
|
reverse("lobby:join_session"),
|
||||||
data={"code": "", "nickname": "Luna"},
|
data={"code": "", "nickname": "Luna"},
|
||||||
@@ -1309,7 +1309,7 @@ class I18nResolverTests(TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(response.status_code, 400)
|
self.assertEqual(response.status_code, 400)
|
||||||
self.assertEqual(resolve_locale(response.wsgi_request), "da")
|
self.assertEqual(resolve_locale(response.wsgi_request), "en")
|
||||||
|
|
||||||
def test_resolve_locale_defaults_to_en_when_header_missing(self):
|
def test_resolve_locale_defaults_to_en_when_header_missing(self):
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
|
|||||||
Reference in New Issue
Block a user