summaryrefslogtreecommitdiff
path: root/django/utils
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2013-02-24 14:43:45 +0100
committerŁukasz Langa <lukasz@langa.pl>2013-02-24 14:43:45 +0100
commit8c8f94fe9dcdd4983ebeb59951e6f7399bc287a2 (patch)
treec1ad036daa4c26f4b220d243a63b86c026cf5f21 /django/utils
parent99edbe0e279166db82caaf545ef92d5446a6a07e (diff)
Fixes #19763 - LocaleMiddleware should check for supported languages in settings.LANGUAGE_CODE
Diffstat (limited to 'django/utils')
-rw-r--r--django/utils/translation/__init__.py14
-rw-r--r--django/utils/translation/trans_real.py28
2 files changed, 29 insertions, 13 deletions
diff --git a/django/utils/translation/__init__.py b/django/utils/translation/__init__.py
index ace87fab4b..10a6cd60fc 100644
--- a/django/utils/translation/__init__.py
+++ b/django/utils/translation/__init__.py
@@ -187,10 +187,10 @@ def get_language_info(lang_code):
try:
return LANG_INFO[lang_code]
except KeyError:
- if '-' in lang_code:
- splited_lang_code = lang_code.split('-')[0]
- try:
- return LANG_INFO[splited_lang_code]
- except KeyError:
- raise KeyError("Unknown language code %s and %s." % (lang_code, splited_lang_code))
- raise KeyError("Unknown language code %s." % lang_code)
+ if '-' not in lang_code:
+ raise KeyError("Unknown language code %s." % lang_code)
+ generic_lang_code = lang_code.split('-')[0]
+ try:
+ return LANG_INFO[generic_lang_code]
+ except KeyError:
+ raise KeyError("Unknown language code %s and %s." % (lang_code, generic_lang_code))
diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py
index 8014b5ea3a..ad172407de 100644
--- a/django/utils/translation/trans_real.py
+++ b/django/utils/translation/trans_real.py
@@ -356,6 +356,20 @@ def check_for_language(lang_code):
return True
return False
+def get_supported_language_variant(lang_code, supported=None):
+ """
+ Returns the language-code that's listed in supported languages, possibly
+ selecting a more generic variant. Raises LookupError if nothing found.
+ """
+ if supported is None:
+ from django.conf import settings
+ supported = dict(settings.LANGUAGES)
+ if lang_code and lang_code not in supported:
+ lang_code = lang_code.split('-')[0] # e.g. if fr-ca is not supported fallback to fr
+ if lang_code and lang_code in supported and check_for_language(lang_code):
+ return lang_code
+ raise LookupError(lang_code)
+
def get_language_from_path(path, supported=None):
"""
Returns the language-code if there is a valid language-code
@@ -396,11 +410,10 @@ def get_language_from_request(request, check_path=False):
lang_code = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME)
- if lang_code and lang_code not in supported:
- lang_code = lang_code.split('-')[0] # e.g. if fr-ca is not supported fallback to fr
-
- if lang_code and lang_code in supported and check_for_language(lang_code):
- return lang_code
+ try:
+ return get_supported_language_variant(lang_code, supported)
+ except LookupError:
+ pass
accept = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
for accept_lang, unused in parse_accept_lang_header(accept):
@@ -434,7 +447,10 @@ def get_language_from_request(request, check_path=False):
_accepted[normalized] = lang
return lang
- return settings.LANGUAGE_CODE
+ try:
+ return get_supported_language_variant(settings.LANGUAGE_CODE, supported)
+ except LookupError:
+ return settings.LANGUAGE_CODE
dot_re = re.compile(r'\S')
def blankout(src, char):