瀏覽代碼

Fixed #27449 -- Added django.utils.translation.get_supported_language_variant().

Sebastian Sangervasi 7 年之前
父節點
當前提交
7905815510
共有 5 個文件被更改,包括 74 次插入1 次删除
  1. 4 0
      django/utils/translation/__init__.py
  2. 7 0
      django/utils/translation/trans_null.py
  3. 17 0
      docs/ref/utils.txt
  4. 2 1
      docs/releases/2.1.txt
  5. 44 0
      tests/i18n/tests.py

+ 4 - 0
django/utils/translation/__init__.py

@@ -205,6 +205,10 @@ def get_language_from_path(path):
     return _trans.get_language_from_path(path)
 
 
+def get_supported_language_variant(lang_code, *, strict=False):
+    return _trans.get_supported_language_variant(lang_code, strict)
+
+
 def templatize(src, **kwargs):
     from .template import templatize
     return templatize(src, **kwargs)

+ 7 - 0
django/utils/translation/trans_null.py

@@ -66,3 +66,10 @@ def get_language_from_request(request, check_path=False):
 
 def get_language_from_path(request):
     return None
+
+
+def get_supported_language_variant(lang_code, strict=False):
+    if lang_code == settings.LANGUAGE_CODE:
+        return lang_code
+    else:
+        raise LookupError(lang_code)

+ 17 - 0
docs/ref/utils.txt

@@ -1092,6 +1092,23 @@ functions without the ``u``.
     for whether its path begins with a language code listed in the
     :setting:`LANGUAGES` setting.
 
+.. function:: get_supported_language_variant(lang_code, strict=False)
+
+    .. versionadded:: 2.1
+
+    Returns ``lang_code`` if it's in the :setting:`LANGUAGES` setting, possibly
+    selecting a more generic variant. For example, ``'es'`` is returned if
+    ``lang_code`` is ``'es-ar'`` and ``'es'`` is in :setting:`LANGUAGES` but
+    ``'es-ar'`` isn't.
+
+    If ``strict`` is ``False`` (the default), a country-specific variant may
+    be returned when neither the language code nor its generic variant is found.
+    For example, if only ``'es-co'`` is in :setting:`LANGUAGES`, that's
+    returned for ``lang_code``\s like ``'es'`` and ``'es-ar'``. Those matches
+    aren't returned if ``strict=True``.
+
+    Raises :exc:`LookupError` if nothing is found.
+
 .. function:: to_locale(language)
 
     Turns a language name (en-us) into a locale name (en_US).

+ 2 - 1
docs/releases/2.1.txt

@@ -162,7 +162,8 @@ Generic Views
 Internationalization
 ~~~~~~~~~~~~~~~~~~~~
 
-* ...
+* Added the :meth:`~django.utils.translation.get_supported_language_variant`
+  function.
 
 Management Commands
 ~~~~~~~~~~~~~~~~~~~

+ 44 - 0
tests/i18n/tests.py

@@ -1306,6 +1306,50 @@ class MiscTests(SimpleTestCase):
         r.META = {'HTTP_ACCEPT_LANGUAGE': 'de'}
         self.assertEqual(g(r), 'zh-hans')
 
+    @override_settings(
+        USE_I18N=True,
+        LANGUAGES=[
+            ('en', 'English'),
+            ('de', 'German'),
+            ('de-at', 'Austrian German'),
+            ('pt-br', 'Portuguese (Brazil)'),
+        ],
+    )
+    def test_get_supported_language_variant_real(self):
+        g = trans_real.get_supported_language_variant
+        self.assertEqual(g('en'), 'en')
+        self.assertEqual(g('en-gb'), 'en')
+        self.assertEqual(g('de'), 'de')
+        self.assertEqual(g('de-at'), 'de-at')
+        self.assertEqual(g('de-ch'), 'de')
+        self.assertEqual(g('pt-br'), 'pt-br')
+        self.assertEqual(g('pt'), 'pt-br')
+        self.assertEqual(g('pt-pt'), 'pt-br')
+        with self.assertRaises(LookupError):
+            g('pt', strict=True)
+        with self.assertRaises(LookupError):
+            g('pt-pt', strict=True)
+        with self.assertRaises(LookupError):
+            g('xyz')
+        with self.assertRaises(LookupError):
+            g('xy-zz')
+
+    def test_get_supported_language_variant_null(self):
+        g = trans_null.get_supported_language_variant
+        self.assertEqual(g(settings.LANGUAGE_CODE), settings.LANGUAGE_CODE)
+        with self.assertRaises(LookupError):
+            g('pt')
+        with self.assertRaises(LookupError):
+            g('de')
+        with self.assertRaises(LookupError):
+            g('de-at')
+        with self.assertRaises(LookupError):
+            g('de', strict=True)
+        with self.assertRaises(LookupError):
+            g('de-at', strict=True)
+        with self.assertRaises(LookupError):
+            g('xyz')
+
     @override_settings(
         LANGUAGES=[
             ('en', 'English'),