diff --git a/lobby/i18n.py b/lobby/i18n.py index 220571f..0a8ac89 100644 --- a/lobby/i18n.py +++ b/lobby/i18n.py @@ -36,7 +36,13 @@ def lobby_i18n_error_messages() -> dict: def resolve_locale(request: HttpRequest) -> str: default_locale, supported_locales = i18n_locale_config() - requested = (get_language_from_request(request) or "").split("-", 1)[0].lower() + + raw_accept_language = (request.META.get("HTTP_ACCEPT_LANGUAGE") or "").split(",", 1)[0] + raw_requested = raw_accept_language.split(";", 1)[0].strip().replace("_", "-").split("-", 1)[0].lower() + if raw_requested in supported_locales: + return raw_requested + + requested = (get_language_from_request(request) or "").replace("_", "-").split("-", 1)[0].lower() if requested in supported_locales: return requested return default_locale diff --git a/lobby/tests.py b/lobby/tests.py index 84e631e..b8ec79d 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -1263,6 +1263,17 @@ class I18nResolverTests(TestCase): self.assertEqual(response.status_code, 400) self.assertEqual(resolve_locale(response.wsgi_request), "da") + def test_resolve_locale_accepts_underscore_language_tags(self): + response = self.client.post( + reverse("lobby:join_session"), + data={"code": "", "nickname": "Luna"}, + content_type="application/json", + HTTP_ACCEPT_LANGUAGE="da_DK", + ) + + self.assertEqual(response.status_code, 400) + self.assertEqual(resolve_locale(response.wsgi_request), "da") + def test_resolve_locale_defaults_to_en_when_header_missing(self): response = self.client.post( reverse("lobby:join_session"),