Commit 6bb2175e authored by Moritz Sichert's avatar Moritz Sichert Committed by Tim Graham
Browse files

Fixed #22106 -- Allowed using more than one instance of javascript_catalog per project.

parent 556eb677
Loading
Loading
Loading
Loading
+75 −75
Original line number Diff line number Diff line
@@ -94,11 +94,17 @@ js_catalog_template = r"""
  django.pluralidx = function (count) { return (count == 1) ? 0 : 1; };
  {% endif %}

  {% if catalog_str %}
  /* gettext library */

  django.catalog = {{ catalog_str }};
  django.catalog = django.catalog || {};
  {% if catalog_str %}
  var newcatalog = {{ catalog_str }};
  for (var key in newcatalog) {
    django.catalog[key] = newcatalog[key];
  }
  {% endif %}

  if (!django.jsi18n_initialized) {
    django.gettext = function (msgid) {
      var value = django.catalog[msgid];
      if (typeof(value) == 'undefined') {
@@ -134,15 +140,6 @@ js_catalog_template = r"""
      }
      return value;
    };
  {% else %}
  /* gettext identity library */

  django.gettext = function (msgid) { return msgid; };
  django.ngettext = function (singular, plural, count) { return (count == 1) ? singular : plural; };
  django.gettext_noop = function (msgid) { return msgid; };
  django.pgettext = function (context, msgid) { return msgid; };
  django.npgettext = function (context, singular, plural, count) { return (count == 1) ? singular : plural; };
  {% endif %}

    django.interpolate = function (fmt, obj, named) {
      if (named) {
@@ -176,6 +173,9 @@ js_catalog_template = r"""
    globals.interpolate = django.interpolate;
    globals.get_format = django.get_format;

    django.jsi18n_initialized = true;
  }

}(this));
{% endautoescape %}
"""
+3 −0
Original line number Diff line number Diff line
@@ -143,6 +143,9 @@ Internationalization
* The :func:`django.views.i18n.set_language` view now properly redirects to
  :ref:`translated URLs <url-internationalization>`, when available.

* The :func:`django.views.i18n.javascript_catalog` view now works correctly
  if used multiple times with different configurations on the same page.

Management Commands
^^^^^^^^^^^^^^^^^^^

+25 −0
Original line number Diff line number Diff line
@@ -952,6 +952,31 @@ different apps and this changes often and you don't want to pull in one big
catalog file. As a security measure, these values can only be either
``django.conf`` or any package from the :setting:`INSTALLED_APPS` setting.

You can also split the catalogs in multiple URLs and load them as you need in
your sites::

    js_info_dict_app = {
        'packages': ('your.app.package',),
    }

    js_info_dict_other_app = {
        'packages': ('your.other.app.package',),
    }

    urlpatterns = [
        url(r'^jsi18n/app/$', javascript_catalog, js_info_dict_app),
        url(r'^jsi18n/other_app/$', javascript_catalog, js_info_dict_other_app),
    ]

If you use more than one ``javascript_catalog`` on a site and some of them
define the same strings, the strings in the catalog that was loaded last take
precedence.

.. versionchanged:: 1.9

    Before Django 1.9, the catalogs completely overwrote each other and you
    could only use one at a time.

The JavaScript translations found in the paths listed in the
:setting:`LOCALE_PATHS` setting are also always included. To keep consistency
with the translations lookup order algorithm used for Python and templates, the
+17 −0
Original line number Diff line number Diff line
<html>
<head>
  <script type="text/javascript" src="/jsi18n/app1/"></script>
  <script type="text/javascript" src="/jsi18n/app2/"></script>
<body>
  <p id="app1string">
    <script type="text/javascript">
      document.write(gettext('this app1 string is to be translated'))
    </script>
  </p>
  <p id="app2string">
    <script type="text/javascript">
      document.write(gettext('this app2 string is to be translated'))
    </script>
  </p>
</body>
</html>
+13 −1
Original line number Diff line number Diff line
# -*- coding:utf-8 -*-
from __future__ import unicode_literals

import gettext
import json
import os
@@ -100,7 +102,7 @@ class I18NTests(TestCase):
                self.assertContains(response, json.dumps(trans_txt), 1)
                if lang_code == 'fr':
                    # Message with context (msgctxt)
                    self.assertContains(response, r'"month name\u0004May": "mai"', 1)
                    self.assertContains(response, '"month name\\u0004May": "mai"', 1)


@override_settings(ROOT_URLCONF='view_tests.urls')
@@ -270,6 +272,16 @@ class JavascriptI18nTests(LiveServerTestCase):
        elem = self.selenium.find_element_by_id("npgettext_plur")
        self.assertEqual(elem.text, "455 Resultate")

    @modify_settings(INSTALLED_APPS={'append': ['view_tests.app1', 'view_tests.app2']})
    @override_settings(LANGUAGE_CODE='fr')
    def test_multiple_catalogs(self):
        self.selenium.get('%s%s' % (self.live_server_url, '/jsi18n_multi_catalogs/'))

        elem = self.selenium.find_element_by_id('app1string')
        self.assertEqual(elem.text, 'il faut traduire cette chaîne de caractères de app1')
        elem = self.selenium.find_element_by_id('app2string')
        self.assertEqual(elem.text, 'il faut traduire cette chaîne de caractères de app2')


class JavascriptI18nChromeTests(JavascriptI18nTests):
    webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
Loading