Fixed #18419 -- Full backwards compatibility for old language codes
Improved documentation about zh-* deprecation and upgrade path. Thanks to Baptiste Mispelon for the code reviews.
This commit is contained in:
parent
76da053641
commit
e5e044da87
|
@ -48,6 +48,12 @@ accept_language_re = re.compile(r'''
|
||||||
|
|
||||||
language_code_prefix_re = re.compile(r'^/([\w-]+)(/|$)')
|
language_code_prefix_re = re.compile(r'^/([\w-]+)(/|$)')
|
||||||
|
|
||||||
|
# some browsers use deprecated locales. refs #18419
|
||||||
|
_DEPRECATED_LOCALES = {
|
||||||
|
'zh-cn': 'zh-hans',
|
||||||
|
'zh-tw': 'zh-hant',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@receiver(setting_changed)
|
@receiver(setting_changed)
|
||||||
def reset_cache(**kwargs):
|
def reset_cache(**kwargs):
|
||||||
|
@ -202,17 +208,11 @@ def activate(language):
|
||||||
language and installs it as the current translation object for the current
|
language and installs it as the current translation object for the current
|
||||||
thread.
|
thread.
|
||||||
"""
|
"""
|
||||||
if isinstance(language, six.string_types):
|
if language in _DEPRECATED_LOCALES:
|
||||||
if language == 'zh-cn':
|
msg = ("The use of the language code %r is deprecated. "
|
||||||
warnings.warn(
|
"Please use the %r translation instead.")
|
||||||
"The use of the language code 'zh-cn' is deprecated. "
|
warnings.warn(msg % (language, _DEPRECATED_LOCALES[language]),
|
||||||
"Please use the 'zh-hans' translation instead.",
|
PendingDeprecationWarning, stacklevel=2)
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
|
||||||
elif language == 'zh-tw':
|
|
||||||
warnings.warn(
|
|
||||||
"The use of the language code 'zh-tw' is deprecated. "
|
|
||||||
"Please use the 'zh-hant' translation instead.",
|
|
||||||
PendingDeprecationWarning, stacklevel=2)
|
|
||||||
_active.value = translation(language)
|
_active.value = translation(language)
|
||||||
|
|
||||||
|
|
||||||
|
@ -410,16 +410,14 @@ def get_supported_language_variant(lang_code, supported=None, strict=False):
|
||||||
If `strict` is False (the default), the function will look for an alternative
|
If `strict` is False (the default), the function will look for an alternative
|
||||||
country-specific variant when the currently checked is not found.
|
country-specific variant when the currently checked is not found.
|
||||||
"""
|
"""
|
||||||
# some browsers use deprecated language codes -- #18419
|
|
||||||
if lang_code == 'zh-cn' and 'zh-hans' in supported:
|
|
||||||
return 'zh-hans'
|
|
||||||
elif lang_code == 'zh-tw' and 'zh-hant' in supported:
|
|
||||||
return 'zh-hant'
|
|
||||||
|
|
||||||
if supported is None:
|
if supported is None:
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
supported = OrderedDict(settings.LANGUAGES)
|
supported = OrderedDict(settings.LANGUAGES)
|
||||||
if lang_code:
|
if lang_code:
|
||||||
|
# some browsers use deprecated language codes -- #18419
|
||||||
|
if (lang_code not in supported and lang_code in _DEPRECATED_LOCALES and
|
||||||
|
_DEPRECATED_LOCALES[lang_code] in supported):
|
||||||
|
return _DEPRECATED_LOCALES[lang_code]
|
||||||
# if fr-CA is not supported, try fr-ca; if that fails, fallback to fr.
|
# if fr-CA is not supported, try fr-ca; if that fails, fallback to fr.
|
||||||
generic_lang_code = lang_code.split('-')[0]
|
generic_lang_code = lang_code.split('-')[0]
|
||||||
variants = (lang_code, lang_code.lower(), generic_lang_code,
|
variants = (lang_code, lang_code.lower(), generic_lang_code,
|
||||||
|
|
|
@ -476,8 +476,8 @@ these changes.
|
||||||
|
|
||||||
* The class ``django.utils.datastructures.MergeDict`` will be removed.
|
* The class ``django.utils.datastructures.MergeDict`` will be removed.
|
||||||
|
|
||||||
* The ``zh_CN`` and ``zh_TW`` language codes will be removed and have been
|
* The ``zh-cn`` and ``zh-tw`` language codes will be removed and have been
|
||||||
replaced by the ``zh_Hans`` and ``zh_Hant`` language code respectively.
|
replaced by the ``zh-hans`` and ``zh-hant`` language code respectively.
|
||||||
|
|
||||||
2.0
|
2.0
|
||||||
---
|
---
|
||||||
|
|
|
@ -707,10 +707,12 @@ arguments into a ``REQUEST`` property on ``WSGIRequest``. To merge
|
||||||
dictionaries, use ``dict.update()`` instead. The class ``MergeDict`` is
|
dictionaries, use ``dict.update()`` instead. The class ``MergeDict`` is
|
||||||
deprecated and will be removed in Django 1.9.
|
deprecated and will be removed in Django 1.9.
|
||||||
|
|
||||||
Language codes ``zh_CN`` and ``zh_TW``
|
Language codes ``zh-cn`` and ``zh-tw``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
The currently used language codes for Simplified Chinese ``zh_CN`` and
|
The currently used language codes for Simplified Chinese ``zh-cn`` and
|
||||||
Traditional Chinese ``zh_TW`` are deprecated and should be replaced by the
|
Traditional Chinese ``zh-tw`` are deprecated and should be replaced by the
|
||||||
recently introduced language codes ``zh_Hans`` and ``zh_Hant`` respectively.
|
recently introduced language codes ``zh-hans`` and ``zh-hant`` respectively.
|
||||||
The deprecated language codes will be removed in Django 1.9.
|
If you use these language codes, you should rename the locale directories
|
||||||
|
and update your settings to reflect these changes. The deprecated language
|
||||||
|
codes will be removed in Django 1.9.
|
||||||
|
|
|
@ -893,9 +893,36 @@ class MiscTests(TransRealMixin, TestCase):
|
||||||
r.COOKIES = {}
|
r.COOKIES = {}
|
||||||
r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-cn,en'}
|
r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-cn,en'}
|
||||||
self.assertEqual(g(r), 'zh-hans')
|
self.assertEqual(g(r), 'zh-hans')
|
||||||
|
|
||||||
r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-tw,en'}
|
r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-tw,en'}
|
||||||
self.assertEqual(g(r), 'zh-hant')
|
self.assertEqual(g(r), 'zh-hant')
|
||||||
|
|
||||||
|
@override_settings(
|
||||||
|
LANGUAGES=(
|
||||||
|
('en', 'English'),
|
||||||
|
('zh-cn', 'Simplified Chinese'),
|
||||||
|
('zh-hans', 'Simplified Chinese'),
|
||||||
|
('zh-hant', 'Traditional Chinese'),
|
||||||
|
('zh-tw', 'Traditional Chinese'),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
def test_backwards_compatibility(self):
|
||||||
|
"""
|
||||||
|
While the old chinese language codes are being deprecated, they should
|
||||||
|
still work as before the new language codes were introduced.
|
||||||
|
|
||||||
|
refs #18419 -- this is explicitly for backwards compatibility and
|
||||||
|
should be removed in Django 1.9
|
||||||
|
"""
|
||||||
|
g = get_language_from_request
|
||||||
|
r = self.rf.get('/')
|
||||||
|
r.COOKIES = {}
|
||||||
|
r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-cn,en'}
|
||||||
|
self.assertEqual(g(r), 'zh-cn')
|
||||||
|
|
||||||
|
r.META = {'HTTP_ACCEPT_LANGUAGE': 'zh-tw,en'}
|
||||||
|
self.assertEqual(g(r), 'zh-tw')
|
||||||
|
|
||||||
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.
|
||||||
|
|
Loading…
Reference in New Issue