diff --git a/django/views/i18n.py b/django/views/i18n.py index 133c42f05b..bfb4bfaca1 100644 --- a/django/views/i18n.py +++ b/django/views/i18n.py @@ -194,7 +194,8 @@ def javascript_catalog(request, domain='djangojs', packages=None): 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) @@ -204,13 +205,12 @@ def javascript_catalog(request, domain='djangojs', packages=None): 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: @@ -222,12 +222,11 @@ def javascript_catalog(request, domain='djangojs', packages=None): 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 = {} diff --git a/tests/regressiontests/views/app0/__init__.py b/tests/regressiontests/views/app0/__init__.py new file mode 100644 index 0000000000..792d600548 --- /dev/null +++ b/tests/regressiontests/views/app0/__init__.py @@ -0,0 +1 @@ +# diff --git a/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mo b/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000000..662204a6d7 Binary files /dev/null and b/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mo differ diff --git a/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po b/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..a458935f96 --- /dev/null +++ b/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po @@ -0,0 +1,20 @@ +# 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 , 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 \n" +"Language-Team: LANGUAGE \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" diff --git a/tests/regressiontests/views/tests/i18n.py b/tests/regressiontests/views/tests/i18n.py index de023be444..f0b3dc57ec 100644 --- a/tests/regressiontests/views/tests/i18n.py +++ b/tests/regressiontests/views/tests/i18n.py @@ -43,9 +43,12 @@ class JsI18NTests(TestCase): 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): """ @@ -75,14 +78,26 @@ class JsI18NTests(TestCase): 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): """ @@ -93,7 +108,6 @@ class JsI18NTests(TestCase): activate('none') response = self.client.get('/views/jsi18n/') self.assertContains(response, 'Choisir une heure') - deactivate() class JsI18NTestsMultiPackage(TestCase): diff --git a/tests/regressiontests/views/urls.py b/tests/regressiontests/views/urls.py index d1412cdeff..0b46d115bf 100644 --- a/tests/regressiontests/views/urls.py +++ b/tests/regressiontests/views/urls.py @@ -16,6 +16,11 @@ js_info_dict = { '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'), @@ -56,6 +61,7 @@ urlpatterns = patterns('', # 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),