Fixed #18393 -- Prevented blocktrans to crash when a variable name is badly formatted.
This commit is contained in:
parent
a535040bfa
commit
432339a72c
|
@ -148,7 +148,7 @@ class BlockTranslateNode(Node):
|
||||||
context.pop()
|
context.pop()
|
||||||
try:
|
try:
|
||||||
result = result % data
|
result = result % data
|
||||||
except KeyError:
|
except (KeyError, ValueError):
|
||||||
with translation.override(None):
|
with translation.override(None):
|
||||||
result = self.render(context)
|
result = self.render(context)
|
||||||
return result
|
return result
|
||||||
|
|
Binary file not shown.
|
@ -17,5 +17,11 @@ msgstr ""
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||||
|
|
||||||
#: template.html:3
|
#: template.html:3
|
||||||
|
# Note: Intentional: variable name is translated.
|
||||||
msgid "My name is %(person)s."
|
msgid "My name is %(person)s."
|
||||||
msgstr "Mon nom est %(personne)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)."
|
|
@ -270,10 +270,11 @@ class TranslationTests(TestCase):
|
||||||
self.assertEqual(to_language('sr_Lat'), 'sr-lat')
|
self.assertEqual(to_language('sr_Lat'), 'sr-lat')
|
||||||
|
|
||||||
@override_settings(LOCALE_PATHS=(os.path.join(here, 'other', 'locale'),))
|
@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
|
Error in translation file should not crash template rendering
|
||||||
(%(person)s is translated as %(personne)s in fr.po)
|
(%(person)s is translated as %(personne)s in fr.po)
|
||||||
|
Refs #16516.
|
||||||
"""
|
"""
|
||||||
from django.template import Template, Context
|
from django.template import Template, Context
|
||||||
with translation.override('fr'):
|
with translation.override('fr'):
|
||||||
|
@ -281,6 +282,19 @@ class TranslationTests(TestCase):
|
||||||
rendered = t.render(Context({'person': 'James'}))
|
rendered = t.render(Context({'person': 'James'}))
|
||||||
self.assertEqual(rendered, 'My name is 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):
|
class FormattingTests(TestCase):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue