Fixed #32581 -- Prevented to_locale() from corrupting locale names.

This commit is contained in:
Claude Paroz 2021-03-21 19:03:57 +01:00 committed by Mariusz Felisiak
parent 9d130920e6
commit d11b9ffcc0
2 changed files with 7 additions and 3 deletions

View File

@ -201,9 +201,9 @@ def to_language(locale):
def to_locale(language): def to_locale(language):
"""Turn a language name (en-us) into a locale name (en_US).""" """Turn a language name (en-us) into a locale name (en_US)."""
language, _, country = language.lower().partition('-') lang, _, country = language.lower().partition('-')
if not country: if not country:
return language return language[:3].lower() + language[3:]
# A language with > 2 characters after the dash only has its first # A language with > 2 characters after the dash only has its first
# character after the dash capitalized; e.g. sr-latn becomes sr_Latn. # character after the dash capitalized; e.g. sr-latn becomes sr_Latn.
# A language with 2 characters after the dash has both characters # A language with 2 characters after the dash has both characters
@ -212,7 +212,7 @@ def to_locale(language):
country = country.title() if len(country) > 2 else country.upper() country = country.title() if len(country) > 2 else country.upper()
if tail: if tail:
country += '-' + tail country += '-' + tail
return language + '_' + country return lang + '_' + country
def get_language_from_request(request, check_path=False): def get_language_from_request(request, check_path=False):

View File

@ -313,12 +313,16 @@ class TranslationTests(SimpleTestCase):
('EN', 'en'), ('EN', 'en'),
('en-us', 'en_US'), ('en-us', 'en_US'),
('EN-US', 'en_US'), ('EN-US', 'en_US'),
('en_US', 'en_US'),
# With > 2 characters after the dash. # With > 2 characters after the dash.
('sr-latn', 'sr_Latn'), ('sr-latn', 'sr_Latn'),
('sr-LATN', 'sr_Latn'), ('sr-LATN', 'sr_Latn'),
('sr_Latn', 'sr_Latn'),
# 3-char language codes. # 3-char language codes.
('ber-MA', 'ber_MA'), ('ber-MA', 'ber_MA'),
('BER-MA', 'ber_MA'), ('BER-MA', 'ber_MA'),
('BER_MA', 'ber_MA'),
('ber_MA', 'ber_MA'),
# With private use subtag (x-informal). # With private use subtag (x-informal).
('nl-nl-x-informal', 'nl_NL-x-informal'), ('nl-nl-x-informal', 'nl_NL-x-informal'),
('NL-NL-X-INFORMAL', 'nl_NL-x-informal'), ('NL-NL-X-INFORMAL', 'nl_NL-x-informal'),