From aa2d636e90631c9d5cace82717f753263fdb0dfe Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Mon, 2 Mar 2026 03:01:10 +0000 Subject: [PATCH] fix(i18n): honor Accept-Language q-values in locale resolver (#225) --- lobby/i18n.py | 13 ++++++++++--- lobby/tests.py | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lobby/i18n.py b/lobby/i18n.py index bb449a8..b5808c8 100644 --- a/lobby/i18n.py +++ b/lobby/i18n.py @@ -39,15 +39,22 @@ def resolve_locale(request: HttpRequest) -> str: default_locale, supported_locales = i18n_locale_config() 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) if quality is not None and quality <= 0: continue tag = candidate.split(";", 1)[0] normalized = tag.strip().replace("_", "-").split("-", 1)[0].lower() - if normalized in supported_locales: - return normalized + if normalized not in supported_locales: + 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() if requested in supported_locales: diff --git a/lobby/tests.py b/lobby/tests.py index fe58883..64e4985 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -1300,7 +1300,7 @@ class I18nResolverTests(TestCase): self.assertEqual(response.status_code, 400) 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( reverse("lobby:join_session"), data={"code": "", "nickname": "Luna"}, @@ -1309,7 +1309,7 @@ class I18nResolverTests(TestCase): ) 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): response = self.client.post(