From 387e192f2584d283d989ebe92e63d174413e30e4 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Thu, 8 Sep 2011 13:25:41 +0000 Subject: [PATCH] Fixed #16721 -- Made sure that blocktrans correctly handles percents (%), even in the plural block. Thanks for the initial patch, Claude Paroz. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16730 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/templatetags/i18n.py | 5 +++-- .../i18n/other/locale/de/LC_MESSAGES/django.mo | Bin 668 -> 922 bytes .../i18n/other/locale/de/LC_MESSAGES/django.po | 12 ++++++++++++ tests/regressiontests/i18n/tests.py | 13 +++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) 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 241de05ddb04199df4a515d720dc9ea263a06ca7..a1a93c83296f0fb97d500466a8df30338fdb137e 100644 GIT binary patch delta 451 zcmZ{d!Ae3w6o!vC%_3+~o6?Y3bU|s+vUQ5I5pW)Kkh#&vUKJi*a82w0;LS3BK{Bo7iml-+dYyrzcUlQYWfmFSVWa9Jw}|JJsmm1NCfQ Ah5!Hn delta 201 zcmbQmK8Lmbo)F7a1|VPqVi_Rz0b*_-t^r~YSOLVGK)e!&S%7#m5c2`?4j`5W;^RQf z0mP4iIG&M#;SG?M1Y#d11_oguod%?tfpis+mH^UqKpJGubRZ2>ZVY5108k7JKng&B m6^KC&0~x^Jl30?eUy_-dy4ito7UN`XW~s@B%p#L3n3Vw0U=-f~ 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):