Anonymous avatar Anonymous committed eb39374

Fixed #13726 -- Further refine changes made in r12384 and r13069 for using non-English source languages in JavaScript translation catalogues. Thanks, Ramiro.

Comments (0)

Files changed (6)

django/views/i18n.py

     locale = to_locale(get_language())
     t = {}
     paths = []
-    en_catalog_missing = False
+    en_selected = locale.startswith('en')
+    en_catalog_missing = True
     # first load all english languages files for defaults
     for package in packages:
         p = importlib.import_module(package)
             catalog = gettext_module.translation(domain, path, ['en'])
             t.update(catalog._catalog)
         except IOError:
-            # 'en' catalog was missing.
-            if locale.startswith('en'):
-                # If 'en' is the selected language this would cause issues
-                # later on if default_locale is something other than 'en'.
-                en_catalog_missing = True
-            # Otherwise it is harmless.
             pass
+        else:
+            # 'en' is the selected language and at least one of the packages
+            # listed in `packages` has an 'en' catalog
+            if en_selected:
+                en_catalog_missing = False
     # next load the settings.LANGUAGE_CODE translations if it isn't english
     if default_locale != 'en':
         for path in paths:
                 t.update(catalog._catalog)
     # last load the currently selected language, if it isn't identical to the default.
     if locale != default_locale:
-        # If the flag en_catalog_missing has been set, the currently
-        # selected language is English but it doesn't have a translation
-        # catalog (presumably due to being the language translated from).
-        # If that is the case, a wrong language catalog might have been
-        # loaded in the previous step. It needs to be discarded.
-        if en_catalog_missing:
+        # If the currently selected language is English but it doesn't have a
+        # translation catalog (presumably due to being the language translated
+        # from) then a wrong language catalog might have been loaded in the
+        # previous step. It needs to be discarded.
+        if en_selected and en_catalog_missing:
             t = {}
         else:
             locale_t = {}

tests/regressiontests/views/app0/__init__.py

+#
Add a comment to this file

tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mo

Binary file added.

tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po

+# 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: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 12:41-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "il faut traduire cette chaîne de caractères de app0"
+msgstr "this app0 string is to be translated"

tests/regressiontests/views/tests/i18n.py

 
     def setUp(self):
         self.old_language_code = settings.LANGUAGE_CODE
+        self.old_installed_apps = settings.INSTALLED_APPS
 
     def tearDown(self):
+        deactivate()
         settings.LANGUAGE_CODE = self.old_language_code
+        settings.INSTALLED_APPS = self.old_installed_apps
 
     def test_jsi18n_with_missing_en_files(self):
         """
     def testI18NLanguageNonEnglishDefault(self):
         """
         Check if the Javascript i18n view returns an empty language catalog
-        if the default language is non-English but the selected language
-        is English. See #13388 and #3594 for more details.
+        if the default language is non-English, the selected language
+        is English and there is not 'en' translation available. See #13388,
+        #3594 and #13726 for more details.
         """
         settings.LANGUAGE_CODE = 'fr'
         activate('en-us')
         response = self.client.get('/views/jsi18n/')
         self.assertNotContains(response, 'Choisir une heure')
-        deactivate()
+
+    def test_nonenglish_default_english_userpref(self):
+        """
+        Same as above with the difference that there IS an 'en' translation
+        available. The Javascript i18n view must return a NON empty language catalog
+        with the proper English translations. See #13726 for more details.
+        """
+        settings.LANGUAGE_CODE = 'fr'
+        settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.views.app0']
+        activate('en-us')
+        response = self.client.get('/views/jsi18n_english_translation/')
+        self.assertContains(response, javascript_quote('this app0 string is to be translated'))
 
     def testI18NLanguageNonEnglishFallback(self):
         """
         activate('none')
         response = self.client.get('/views/jsi18n/')
         self.assertContains(response, 'Choisir une heure')
-        deactivate()
 
 
 class JsI18NTestsMultiPackage(TestCase):

tests/regressiontests/views/urls.py

     'packages': ('regressiontests.views',),
 }
 
+js_info_dict_english_translation = {
+    'domain': 'djangojs',
+    'packages': ('regressiontests.views.app0',),
+}
+
 js_info_dict_multi_packages1 = {
     'domain': 'djangojs',
     'packages': ('regressiontests.views.app1', 'regressiontests.views.app2'),
     # i18n views
     (r'^i18n/', include('django.conf.urls.i18n')),
     (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
+    (r'^jsi18n_english_translation/$', 'django.views.i18n.javascript_catalog', js_info_dict_english_translation),
     (r'^jsi18n_multi_packages1/$', 'django.views.i18n.javascript_catalog', js_info_dict_multi_packages1),
     (r'^jsi18n_multi_packages2/$', 'django.views.i18n.javascript_catalog', js_info_dict_multi_packages2),
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.