From 4720c36a96012c22c648e15de9f33bbed1c49ef8 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 6 Sep 2008 16:15:38 +0200 Subject: [PATCH] Fixed a bug in the i18n extension that caused the explicit pluralization block to look up the wrong variable. --HG-- branch : trunk --- CHANGES | 3 +++ jinja2/ext.py | 14 +++++++++++++- tests/test_i18n.py | 10 ++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 8f95741..23ad978 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,9 @@ Version 2.1 change an inner loop overwrote the loop variable from the outer one after iteration. +- fixed a bug with the i18n extension that caused the explicit pluralization + block to look up the wrong variable. + Version 2.0 ----------- (codename jinjavitus, released on July 17th 2008) diff --git a/jinja2/ext.py b/jinja2/ext.py index 0f30d54..e140fbc 100644 --- a/jinja2/ext.py +++ b/jinja2/ext.py @@ -124,6 +124,13 @@ class InternationalizationExtension(Extension): """This extension adds gettext support to Jinja2.""" tags = set(['trans']) + # TODO: the i18n extension is currently reevaluating values in a few + # situations. Take this example: + # {% trans count=something() %}{{ count }} foo{% pluralize + # %}{{ count }} fooss{% endtrans %} + # something is called twice here. One time for the gettext value and + # the other time for the n-parameter of the ngettext function. + def __init__(self, environment): Extension.__init__(self, environment) environment.globals['_'] = _gettext_alias @@ -205,7 +212,12 @@ class InternationalizationExtension(Extension): have_plural = True parser.stream.next() if parser.stream.current.type is not 'block_end': - plural_expr = parser.parse_expression() + name = parser.stream.expect('name') + if name.value not in variables: + parser.fail('unknown variable %r for pluralization' % + name.value, name.lineno, + exc=TemplateAssertionError) + plural_expr = variables[name.value] parser.stream.expect('block_end') plural_names, plural = self._parse_block(parser, False) parser.stream.next() diff --git a/tests/test_i18n.py b/tests/test_i18n.py index 3b72283..4890904 100644 --- a/tests/test_i18n.py +++ b/tests/test_i18n.py @@ -6,7 +6,9 @@ :copyright: 2007 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ +from py.test import raises from jinja2 import Environment, DictLoader, contextfunction +from jinja2.exceptions import TemplateAssertionError templates = { 'master.html': '{{ page_title|default(_("missing")) }}' @@ -66,6 +68,14 @@ def test_trans_plural(): assert tmpl.render(LANGUAGE='de', user_count=2) == '2 Benutzer online' +def test_complex_plural(): + tmpl = i18n_env.from_string('{% trans foo=42, count=2 %}{{ count }} item{% ' + 'pluralize count %}{{ count }} items{% endtrans %}') + assert tmpl.render() == '2 items' + raises(TemplateAssertionError, i18n_env.from_string, + '{% trans foo %}...{% pluralize bar %}...{% endtrans %}') + + def test_trans_stringformatting(): tmpl = i18n_env.get_template('stringformat.html') assert tmpl.render(LANGUAGE='de', user_count=5) == 'Benutzer: 5' -- 2.26.2