Commit 4b28ea37 authored by Julien Phalip's avatar Julien Phalip
Browse files

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

Fixed #18393 -- Prevented blocktrans to crash when a variable name is badly formatted.
parents 28e42453 432339a7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+6 −0
Original line number Diff line number Diff line
@@ -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
+15 −1
Original line number Diff line number Diff line
@@ -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):