diff --git a/django/views/i18n.py b/django/views/i18n.py index 9b1c87dac6f..5cb59c32629 100644 --- a/django/views/i18n.py +++ b/django/views/i18n.py @@ -177,6 +177,7 @@ def javascript_catalog(request, domain='djangojs', packages=None): locale = to_locale(get_language()) t = {} paths = [] + en_catalog_missing = False # first load all english languages files for defaults for package in packages: p = importlib.import_module(package) @@ -186,7 +187,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. This is harmless. + # '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 # next load the settings.LANGUAGE_CODE translations if it isn't english if default_locale != 'en': @@ -199,13 +205,21 @@ 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: - for path in paths: - try: - catalog = gettext_module.translation(domain, path, [locale]) - except IOError: - catalog = None - if catalog is not None: - t.update(catalog._catalog) + # 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: + t = {} + else: + for path in paths: + try: + catalog = gettext_module.translation(domain, path, [locale]) + except IOError: + catalog = None + if catalog is not None: + t.update(catalog._catalog) src = [LibHead] plural = None if '' in t: diff --git a/tests/regressiontests/views/locale/en/LC_MESSAGES/djangojs.mo b/tests/regressiontests/views/locale/en/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7593e1eb488..00000000000 Binary files a/tests/regressiontests/views/locale/en/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/tests/regressiontests/views/locale/en/LC_MESSAGES/djangojs.po b/tests/regressiontests/views/locale/en/LC_MESSAGES/djangojs.po deleted file mode 100644 index 54ee2c40652..00000000000 --- a/tests/regressiontests/views/locale/en/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,20 +0,0 @@ -# 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 16:45+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\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 "this is to be translated" -msgstr "this is to be translated in english" \ No newline at end of file diff --git a/tests/regressiontests/views/tests/i18n.py b/tests/regressiontests/views/tests/i18n.py index b0fa3e3f473..a6b0b893895 100644 --- a/tests/regressiontests/views/tests/i18n.py +++ b/tests/regressiontests/views/tests/i18n.py @@ -21,7 +21,7 @@ class I18NTests(TestCase): def test_jsi18n(self): """The javascript_catalog can be deployed with language settings""" - for lang_code in ['es', 'fr', 'en', 'ru']: + for lang_code in ['es', 'fr', 'ru']: activate(lang_code) catalog = gettext.translation('djangojs', locale_dir, [lang_code]) trans_txt = catalog.ugettext('this is to be translated') @@ -30,3 +30,40 @@ class I18NTests(TestCase): # catalog['this is to be translated'] = 'same_that_trans_txt' # javascript_quote is used to be able to check unicode strings self.assertContains(response, javascript_quote(trans_txt), 1) + +class JsI18NTests(TestCase): + """ + Tests django views in django/views/i18n.py that need to change + settings.LANGUAGE_CODE. + """ + + def setUp(self): + self.old_language_code = settings.LANGUAGE_CODE + + def tearDown(self): + settings.LANGUAGE_CODE = self.old_language_code + + def test_jsi18n_with_missing_en_files(self): + """ + The javascript_catalog shouldn't load the fallback language in the + case that the current selected language is actually the one translated + from, and hence missing translation files completely. + + This happens easily when you're translating from English to other + languages and you've set settings.LANGUAGE_CODE to some other language + than English. + """ + settings.LANGUAGE_CODE = 'es' + activate('en-us') + response = self.client.get('/views/jsi18n/') + self.assertNotContains(response, 'esto tiene que ser traducido') + + def test_jsi18n_fallback_language(self): + """ + Let's make sure that the fallback language is still working properly + in cases where the selected language cannot be found. + """ + settings.LANGUAGE_CODE = 'fr' + activate('fi') + response = self.client.get('/views/jsi18n/') + self.assertContains(response, 'il faut le traduire')