diff options
| 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 |
| commit | 8c8f94fe9dcdd4983ebeb59951e6f7399bc287a2 (patch) | |
| tree | c1ad036daa4c26f4b220d243a63b86c026cf5f21 /django/utils | |
| parent | 99edbe0e279166db82caaf545ef92d5446a6a07e (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__.py | 14 | ||||
| -rw-r--r-- | django/utils/translation/trans_real.py | 28 |
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): |
