1
0
mirror of https://github.com/django/django.git synced 2025-01-03 15:06:09 +00:00

Fixed #32479 -- Added fallbacks to subsequent language codes in translations.

Thanks Claude Paroz and Nick Pope for reviews.
This commit is contained in:
Maxim Beder 2021-04-30 00:40:06 +02:00 committed by Mariusz Felisiak
parent 96f55ccf79
commit 06fd4df41a
2 changed files with 26 additions and 3 deletions

View File

@ -474,14 +474,17 @@ def get_supported_language_variant(lang_code, strict=False):
<https://www.djangoproject.com/weblog/2007/oct/26/security-fix/>. <https://www.djangoproject.com/weblog/2007/oct/26/security-fix/>.
""" """
if lang_code: if lang_code:
# If 'fr-ca' is not supported, try special fallback or language-only 'fr'. # If 'zh-hant-tw' is not supported, try special fallback or subsequent
# language codes i.e. 'zh-hant' and 'zh'.
possible_lang_codes = [lang_code] possible_lang_codes = [lang_code]
try: try:
possible_lang_codes.extend(LANG_INFO[lang_code]['fallback']) possible_lang_codes.extend(LANG_INFO[lang_code]['fallback'])
except KeyError: except KeyError:
pass pass
generic_lang_code = lang_code.split('-')[0] i = None
possible_lang_codes.append(generic_lang_code) while (i := lang_code.rfind('-', 0, i)) > -1:
possible_lang_codes.append(lang_code[:i])
generic_lang_code = possible_lang_codes[-1]
supported_lang_codes = get_languages() supported_lang_codes = get_languages()
for code in possible_lang_codes: for code in possible_lang_codes:

View File

@ -1424,6 +1424,26 @@ class MiscTests(SimpleTestCase):
r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-my,en'} r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-my,en'}
self.assertEqual(get_language_from_request(r), 'zh-hans') self.assertEqual(get_language_from_request(r), 'zh-hans')
def test_subsequent_code_fallback_language(self):
"""
Subsequent language codes should be used when the language code is not
supported.
"""
tests = [
('zh-Hans-CN', 'zh-hans'),
('zh-hans-mo', 'zh-hans'),
('zh-hans-HK', 'zh-hans'),
('zh-Hant-HK', 'zh-hant'),
('zh-hant-tw', 'zh-hant'),
('zh-hant-SG', 'zh-hant'),
]
r = self.rf.get('/')
r.COOKIES = {}
for value, expected in tests:
with self.subTest(value=value):
r.META = {'HTTP_ACCEPT_LANGUAGE': f'{value},en'}
self.assertEqual(get_language_from_request(r), expected)
def test_parse_language_cookie(self): def test_parse_language_cookie(self):
""" """
Now test that we parse language preferences stored in a cookie correctly. Now test that we parse language preferences stored in a cookie correctly.