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)
"""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
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()
: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>'
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'