Loading django/views/i18n.py +75 −75 Original line number Diff line number Diff line Loading @@ -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') { Loading Loading @@ -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) { Loading Loading @@ -176,6 +173,9 @@ js_catalog_template = r""" globals.interpolate = django.interpolate; globals.get_format = django.get_format; django.jsi18n_initialized = true; } }(this)); {% endautoescape %} """ Loading docs/releases/1.9.txt +3 −0 Original line number Diff line number Diff line Loading @@ -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 ^^^^^^^^^^^^^^^^^^^ Loading docs/topics/i18n/translation.txt +25 −0 Original line number Diff line number Diff line Loading @@ -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 Loading tests/view_tests/templates/jsi18n-multi-catalogs.html 0 → 100644 +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> tests/view_tests/tests/test_i18n.py +13 −1 Original line number Diff line number Diff line # -*- coding:utf-8 -*- from __future__ import unicode_literals import gettext import json import os Loading Loading @@ -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') Loading Loading @@ -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 Loading
django/views/i18n.py +75 −75 Original line number Diff line number Diff line Loading @@ -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') { Loading Loading @@ -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) { Loading Loading @@ -176,6 +173,9 @@ js_catalog_template = r""" globals.interpolate = django.interpolate; globals.get_format = django.get_format; django.jsi18n_initialized = true; } }(this)); {% endautoescape %} """ Loading
docs/releases/1.9.txt +3 −0 Original line number Diff line number Diff line Loading @@ -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 ^^^^^^^^^^^^^^^^^^^ Loading
docs/topics/i18n/translation.txt +25 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
tests/view_tests/templates/jsi18n-multi-catalogs.html 0 → 100644 +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>
tests/view_tests/tests/test_i18n.py +13 −1 Original line number Diff line number Diff line # -*- coding:utf-8 -*- from __future__ import unicode_literals import gettext import json import os Loading Loading @@ -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') Loading Loading @@ -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