Fixed a bug in the i18n extension that caused the explicit pluralization block to...
authorArmin Ronacher <armin.ronacher@active-4.com>
Sat, 6 Sep 2008 14:15:38 +0000 (16:15 +0200)
committerArmin Ronacher <armin.ronacher@active-4.com>
Sat, 6 Sep 2008 14:15:38 +0000 (16:15 +0200)
--HG--
branch : trunk

CHANGES
jinja2/ext.py
tests/test_i18n.py

diff --git a/CHANGES b/CHANGES
index 8f957411e9d01a3be71991d756e78d8c189c5407..23ad978cecad887f9d3b01cffb05636c81232e4a 100644 (file)
--- 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)
index 0f30d5477f85f207e23628a30b97f53bd9e9e1a3..e140fbceccc62022bc54fc3757373b513166dd7a 100644 (file)
@@ -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()
index 3b722835c9df54dc086282ca37e91d9910518fce..4890904aa53735e21e083753e14665a6accac3d1 100644 (file)
@@ -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': '<title>{{ page_title|default(_("missing")) }}</title>'
@@ -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'