diff --git a/django/templatetags/i18n.py b/django/templatetags/i18n.py index ca79f41edc..e090781080 100644 --- a/django/templatetags/i18n.py +++ b/django/templatetags/i18n.py @@ -148,7 +148,7 @@ class BlockTranslateNode(Node): context.pop() try: result = result % data - except KeyError: + except (KeyError, ValueError): with translation.override(None): result = self.render(context) return result diff --git a/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.mo b/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.mo index f0a2179767..478338bc88 100644 Binary files a/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.mo and b/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.mo differ diff --git a/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.po b/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.po index 8e9b9e1034..dafb6139ae 100644 --- a/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.po +++ b/tests/regressiontests/i18n/other/locale/fr/LC_MESSAGES/django.po @@ -17,5 +17,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: template.html:3 +# Note: Intentional: variable name is translated. msgid "My name is %(person)s." msgstr "Mon nom est %(personne)s." + +#: template.html:3 +# Note: Intentional: the variable name is badly formatted (missing 's' at the end) +msgid "My other name is %(person)s." +msgstr "Mon autre nom est %(person)." \ No newline at end of file diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index 5e95ee36ec..78e41321af 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -270,10 +270,11 @@ class TranslationTests(TestCase): self.assertEqual(to_language('sr_Lat'), 'sr-lat') @override_settings(LOCALE_PATHS=(os.path.join(here, 'other', 'locale'),)) - def test_bad_placeholder(self): + def test_bad_placeholder_1(self): """ Error in translation file should not crash template rendering (%(person)s is translated as %(personne)s in fr.po) + Refs #16516. """ from django.template import Template, Context with translation.override('fr'): @@ -281,6 +282,19 @@ class TranslationTests(TestCase): rendered = t.render(Context({'person': 'James'})) self.assertEqual(rendered, 'My name is James.') + @override_settings(LOCALE_PATHS=(os.path.join(here, 'other', 'locale'),)) + def test_bad_placeholder_2(self): + """ + Error in translation file should not crash template rendering + (%(person) misses a 's' in fr.po, causing the string formatting to fail) + Refs #18393. + """ + from django.template import Template, Context + with translation.override('fr'): + t = Template('{% load i18n %}{% blocktrans %}My other name is {{ person }}.{% endblocktrans %}') + rendered = t.render(Context({'person': 'James'})) + self.assertEqual(rendered, 'My other name is James.') + class FormattingTests(TestCase):