diff --git a/django/templatetags/i18n.py b/django/templatetags/i18n.py index 519354985f..669cdc911a 100644 --- a/django/templatetags/i18n.py +++ b/django/templatetags/i18n.py @@ -116,16 +116,17 @@ class BlockTranslateNode(Node): # the end of function context.update(tmp_context) singular, vars = self.render_token_list(self.singular) + # Escape all isolated '%' + singular = re.sub(u'%(?!\()', u'%%', singular) if self.plural and self.countervar and self.counter: count = self.counter.resolve(context) context[self.countervar] = count plural, plural_vars = self.render_token_list(self.plural) + plural = re.sub(u'%(?!\()', u'%%', plural) result = translation.ungettext(singular, plural, count) vars.extend(plural_vars) else: result = translation.ugettext(singular) - # Escape all isolated '%' before substituting in the context. - result = re.sub(u'%(?!\()', u'%%', result) data = dict([(v, _render_value_in_context(context.get(v, ''), context)) for v in vars]) context.pop() try: diff --git a/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.mo b/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.mo index 241de05ddb..a1a93c8329 100644 Binary files a/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.mo and b/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.mo differ diff --git a/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.po b/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.po index 2d9b89e23c..7226ad1943 100644 --- a/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.po +++ b/tests/regressiontests/i18n/other/locale/de/LC_MESSAGES/django.po @@ -40,3 +40,15 @@ msgid "%d result" msgid_plural "%d results" msgstr[0] "%d Resultat" msgstr[1] "%d Resultate" + +#: models.py:13 +#, python-format +msgid "The result was %(percent)s%%" +msgstr "Das Ergebnis war %(percent)s%%" + +#: models.py:13 +#, python-format +msgid "%(percent)s%% represents %(num)s object" +msgid_plural "%(percent)s%% represents %(num)s objects" +msgstr[0] "%(percent)s%% stellt %(num)s Objekt dar" +msgstr[1] "%(percent)s%% stellt %(num)s Objekte dar" diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index f230e59556..e6799ae28e 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -618,6 +618,19 @@ class MiscTests(TestCase): r.META = {'HTTP_ACCEPT_LANGUAGE': 'de'} self.assertEqual(g(r), 'zh-cn') + def test_percent_in_translatable_block(self): + extended_locale_paths = settings.LOCALE_PATHS + ( + os.path.join(here, 'other', 'locale'), + ) + with self.settings(LOCALE_PATHS=extended_locale_paths): + t_sing = Template("{% load i18n %}{% blocktrans %}The result was {{ percent }}%{% endblocktrans %}") + t_plur = Template("{% load i18n %}{% blocktrans count num as number %}{{ percent }}% represents {{ num }} object{% plural %}{{ percent }}% represents {{ num }} objects{% endblocktrans %}") + with translation.override('de'): + self.assertEqual(t_sing.render(Context({'percent': 42})), u'Das Ergebnis war 42%') + self.assertEqual(t_plur.render(Context({'percent': 42, 'num': 1})), u'42% stellt 1 Objekt dar') + self.assertEqual(t_plur.render(Context({'percent': 42, 'num': 4})), u'42% stellt 4 Objekte dar') + + class ResolutionOrderI18NTests(TestCase): def setUp(self):