Merge pull request #94 from jphalip/tickets/18393-blocktrans-valueerror

Fixed #18393 -- Prevented blocktrans to crash when a variable name is badly formatted.
This commit is contained in:
Julien Phalip 2012-05-29 22:47:08 -07:00
commit 4b28ea37e5
4 changed files with 22 additions and 2 deletions

View File

@ -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

View File

@ -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)."

View File

@ -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):