summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/views/i18n.py12
-rw-r--r--docs/releases/2.0.txt3
-rw-r--r--js_tests/admin/jsi18n-mocks.test.js4
-rw-r--r--tests/view_tests/templates/jsi18n.html8
-rw-r--r--tests/view_tests/tests/test_i18n.py16
5 files changed, 30 insertions, 13 deletions
diff --git a/django/views/i18n.py b/django/views/i18n.py
index ce78742fd8..261d66fe8c 100644
--- a/django/views/i18n.py
+++ b/django/views/i18n.py
@@ -8,7 +8,6 @@ from django.conf import settings
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.template import Context, Engine
from django.urls import translate_url
-from django.utils.encoding import force_text
from django.utils.formats import get_format
from django.utils.http import is_safe_url
from django.utils.translation import (
@@ -68,16 +67,7 @@ def get_formats():
'THOUSAND_SEPARATOR', 'NUMBER_GROUPING',
'DATE_INPUT_FORMATS', 'TIME_INPUT_FORMATS', 'DATETIME_INPUT_FORMATS'
)
- result = {}
- for attr in FORMAT_SETTINGS:
- result[attr] = get_format(attr)
- formats = {}
- for k, v in result.items():
- if isinstance(v, (int, str)):
- formats[k] = force_text(v)
- elif isinstance(v, (tuple, list)):
- formats[k] = [force_text(value) for value in v]
- return formats
+ return {attr: get_format(attr) for attr in FORMAT_SETTINGS}
js_catalog_template = r"""
diff --git a/docs/releases/2.0.txt b/docs/releases/2.0.txt
index 5afe526d13..450d8bd3da 100644
--- a/docs/releases/2.0.txt
+++ b/docs/releases/2.0.txt
@@ -326,6 +326,9 @@ Miscellaneous
require them. Third-party apps that use these methods may want to adopt a
similar approach.
+* The ``FIRST_DAY_OF_WEEK`` and ``NUMBER_GROUPING`` format settings are now
+ kept as integers in JavaScript and JSON i18n view outputs.
+
.. _deprecated-features-2.0:
Features deprecated in 2.0
diff --git a/js_tests/admin/jsi18n-mocks.test.js b/js_tests/admin/jsi18n-mocks.test.js
index 4858de6eb3..f04b0576f6 100644
--- a/js_tests/admin/jsi18n-mocks.test.js
+++ b/js_tests/admin/jsi18n-mocks.test.js
@@ -53,9 +53,9 @@
"%m/%d/%y"
],
"DECIMAL_SEPARATOR": ".",
- "FIRST_DAY_OF_WEEK": "0",
+ "FIRST_DAY_OF_WEEK": 0,
"MONTH_DAY_FORMAT": "F j",
- "NUMBER_GROUPING": "3",
+ "NUMBER_GROUPING": 3,
"SHORT_DATETIME_FORMAT": "m/d/Y P",
"SHORT_DATE_FORMAT": "m/d/Y",
"THOUSAND_SEPARATOR": ",",
diff --git a/tests/view_tests/templates/jsi18n.html b/tests/view_tests/templates/jsi18n.html
index d6093c8ef4..df1c4b400c 100644
--- a/tests/view_tests/templates/jsi18n.html
+++ b/tests/view_tests/templates/jsi18n.html
@@ -4,6 +4,14 @@
</head>
<body>
+ <p id="formats">
+ <script type="text/javascript">
+ document.write("DATE_INPUT_FORMATS is an " + typeof get_format("DATE_INPUT_FORMATS") + "; ");
+ document.write("DECIMAL_SEPARATOR is a " + typeof get_format("DECIMAL_SEPARATOR") + "; ");
+ document.write("FIRST_DAY_OF_WEEK is a " + typeof get_format("FIRST_DAY_OF_WEEK") + ";");
+ </script>
+ </p>
+
<p id="gettext">
<script type="text/javascript">
document.write(gettext("Remove"));
diff --git a/tests/view_tests/tests/test_i18n.py b/tests/view_tests/tests/test_i18n.py
index 25cc7cfab6..2c12177a59 100644
--- a/tests/view_tests/tests/test_i18n.py
+++ b/tests/view_tests/tests/test_i18n.py
@@ -11,6 +11,7 @@ from django.urls import reverse
from django.utils.translation import (
LANGUAGE_SESSION_KEY, get_language, override,
)
+from django.views.i18n import get_formats
from ..urls import locale_dir
@@ -183,6 +184,14 @@ class SetLanguageTests(TestCase):
@override_settings(ROOT_URLCONF='view_tests.urls')
class I18NViewTests(SimpleTestCase):
"""Test django.views.i18n views other than set_language."""
+ @override_settings(LANGUAGE_CODE='de')
+ def test_get_formats(self):
+ formats = get_formats()
+ # Test 3 possible types in get_formats: integer, string, and list.
+ self.assertEqual(formats['FIRST_DAY_OF_WEEK'], 0)
+ self.assertEqual(formats['DECIMAL_SEPARATOR'], '.')
+ self.assertEqual(formats['TIME_INPUT_FORMATS'], ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'])
+
def test_jsi18n(self):
"""The javascript_catalog can be deployed with language settings"""
for lang_code in ['es', 'fr', 'ru']:
@@ -214,6 +223,8 @@ class I18NViewTests(SimpleTestCase):
data = json.loads(response.content.decode())
self.assertIn('catalog', data)
self.assertIn('formats', data)
+ self.assertEqual(data['formats']['TIME_INPUT_FORMATS'], ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'])
+ self.assertEqual(data['formats']['FIRST_DAY_OF_WEEK'], 0)
self.assertIn('plural', data)
self.assertEqual(data['catalog']['month name\x04May'], 'Mai')
self.assertIn('DATETIME_FORMAT', data['formats'])
@@ -398,6 +409,11 @@ class I18nSeleniumTests(SeleniumTestCase):
self.assertEqual(elem.text, "1 Resultat")
elem = self.selenium.find_element_by_id("npgettext_plur")
self.assertEqual(elem.text, "455 Resultate")
+ elem = self.selenium.find_element_by_id("formats")
+ self.assertEqual(
+ elem.text,
+ "DATE_INPUT_FORMATS is an object; DECIMAL_SEPARATOR is a string; FIRST_DAY_OF_WEEK is a number;"
+ )
@modify_settings(INSTALLED_APPS={'append': ['view_tests.app1', 'view_tests.app2']})
@override_settings(LANGUAGE_CODE='fr')