summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2017-09-07 10:09:07 -0400
committerTim Graham <timograham@gmail.com>2017-09-08 13:46:00 -0400
commit0c4ac12a7b4184ff2535faa7a0a79ee33c8fff7f (patch)
treee23e2d04bf6fe20dc3d942a68a952fa3a75b1a10
parent9829b75d5bf468cb18e0fffdfc4a65dd7d8a6b2d (diff)
Fixed #28546 -- Fixed translation's to_locale() with langauge subtags.
Thanks Brent Hand for the initial patch.
-rw-r--r--django/utils/translation/trans_real.py19
-rw-r--r--tests/i18n/tests.py2
2 files changed, 14 insertions, 7 deletions
diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py
index a9447d7896..9ec8085dae 100644
--- a/django/utils/translation/trans_real.py
+++ b/django/utils/translation/trans_real.py
@@ -58,14 +58,19 @@ def reset_cache(**kwargs):
def to_locale(language):
"""Turn a language name (en-us) into a locale name (en_US)."""
- p = language.find('-')
- if p >= 0:
- # Get correct locale for sr-latn
- if len(language[p + 1:]) > 2:
- return language[:p].lower() + '_' + language[p + 1].upper() + language[p + 2:].lower()
- return language[:p].lower() + '_' + language[p + 1:].upper()
+ language = language.lower()
+ parts = language.split('-')
+ try:
+ country = parts[1]
+ except IndexError:
+ return language
else:
- return language.lower()
+ # A language with > 2 characters after the dash only has its first
+ # character after the dash capitalized; e.g. sr-latn becomes sr_Latn.
+ # A language with 2 characters after the dash has both characters
+ # capitalized; e.g. en-us becomes en_US.
+ parts[1] = country.title() if len(country) > 2 else country.upper()
+ return parts[0] + '_' + '-'.join(parts[1:])
def to_language(locale):
diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py
index c33677c76a..449def5363 100644
--- a/tests/i18n/tests.py
+++ b/tests/i18n/tests.py
@@ -268,6 +268,8 @@ class TranslationTests(SimpleTestCase):
('sr-latn', 'sr_Latn'),
('sr-LATN', 'sr_Latn'),
# With private use subtag (x-informal).
+ ('nl-nl-x-informal', 'nl_NL-x-informal'),
+ ('NL-NL-X-INFORMAL', 'nl_NL-x-informal'),
('sr-latn-x-informal', 'sr_Latn-x-informal'),
('SR-LATN-X-INFORMAL', 'sr_Latn-x-informal'),
)