瀏覽代碼

Fixed #29144 -- Made untranslated strings for territorial language variants use translations from the generic language variant.

Patryk Zawadzki 7 年之前
父節點
當前提交
a20aae414e

+ 2 - 0
django/utils/translation/trans_real.py

@@ -202,6 +202,8 @@ class DjangoTranslation(gettext_module.GNUTranslations):
             self._catalog = other._catalog.copy()
         else:
             self._catalog.update(other._catalog)
+        if other._fallback:
+            self.add_fallback(other._fallback)
 
     def language(self):
         """Return the translation language."""

+ 4 - 0
docs/releases/2.1.txt

@@ -179,6 +179,10 @@ Internationalization
 * Added the :meth:`~django.utils.translation.get_supported_language_variant`
   function.
 
+* Untranslated strings for territorial language variants now use the
+  translations of the generic language. For example, untranslated ``pt_BR``
+  strings use ``pt`` translations.
+
 Management Commands
 ~~~~~~~~~~~~~~~~~~~
 

+ 7 - 1
docs/topics/i18n/translation.txt

@@ -2082,7 +2082,13 @@ translations for the same literal:
 
 In all cases the name of the directory containing the translation is expected to
 be named using :term:`locale name` notation. E.g. ``de``, ``pt_BR``, ``es_AR``,
-etc.
+etc. Untranslated strings for territorial language variants use the translations
+of the generic language. For example, untranslated ``pt_BR`` strings use ``pt``
+translations.
+
+.. versionchanged:: 2.1
+
+    Fallback to the generic language as described above was added.
 
 This way, you can write applications that include their own translations, and
 you can override base translations in your project. Or, you can just build

+ 0 - 0
tests/i18n/territorial_fallback/__init__.py


二進制
tests/i18n/territorial_fallback/locale/de/LC_MESSAGES/django.mo


+ 27 - 0
tests/i18n/territorial_fallback/locale/de/LC_MESSAGES/django.po

@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-25 15:39-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: DE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Translators: This comment should be extracted
+#: __init__.py:1
+msgid "Test 1 (en)"
+msgstr "Test 1 (de)"
+
+#: __init__.py:2
+msgid "Test 2 (en)"
+msgstr "Test 2 (de)"

二進制
tests/i18n/territorial_fallback/locale/de_DE/LC_MESSAGES/django.mo


+ 27 - 0
tests/i18n/territorial_fallback/locale/de_DE/LC_MESSAGES/django.po

@@ -0,0 +1,27 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-25 15:39-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: DE-DE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Translators: This comment should be extracted
+#: __init__.py:1
+msgid "Test 1 (en)"
+msgstr "Test 1 (de-de)"
+
+#: __init__.py:2
+msgid "Test 2 (en)"
+msgstr ""

+ 14 - 0
tests/i18n/tests.py

@@ -1455,6 +1455,20 @@ class DjangoFallbackResolutionOrderI18NTests(ResolutionOrderI18NTests):
         self.assertEqual(gettext('Date/time'), 'Datum/Zeit')
 
 
+@override_settings(INSTALLED_APPS=['i18n.territorial_fallback'])
+class TranslationFallbackI18NTests(ResolutionOrderI18NTests):
+
+    def test_sparse_territory_catalog(self):
+        """
+        Untranslated strings for territorial language variants use the
+        translations of the generic language. In this case, the de-de
+        translation falls back to de.
+        """
+        with translation.override('de-de'):
+            self.assertGettext('Test 1 (en)', '(de-de)')
+            self.assertGettext('Test 2 (en)', '(de)')
+
+
 class TestModels(TestCase):
     def test_lazy(self):
         tm = TestModel()