]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Make nested-trans-block exceptions nicer 1918/head
authorAarni Koskela <akx@iki.fi>
Fri, 15 Dec 2023 14:24:32 +0000 (16:24 +0200)
committerDavid Lord <davidism@gmail.com>
Wed, 10 Jan 2024 22:27:09 +0000 (14:27 -0800)
CHANGES.rst
src/jinja2/ext.py
tests/test_ext.py

index d6688e762548169a28d6df4bcadf057030c4af42..bced976e50f03125e59a90e2ecb0818f9adb0fe5 100644 (file)
@@ -8,6 +8,8 @@ Unreleased
 -   Fix compiler error when checking if required blocks in parent templates are
     empty. :pr:`1858`
 -   ``xmlattr`` filter does not allow keys with spaces. GHSA-h5c8-rqwp-cp95
+-   Make error messages stemming from invalid nesting of ``{% trans %}`` blocks
+    more helpful. :pr:`1916`
 
 
 Version 3.1.2
index 354b4063db256fe75cdf6436c2adbf7a88f1cdbc..fade1fa3bc89b0d85d6ae3915277b835c67d7030 100644 (file)
@@ -495,16 +495,26 @@ class InternationalizationExtension(Extension):
                 parser.stream.expect("variable_end")
             elif parser.stream.current.type == "block_begin":
                 next(parser.stream)
-                if parser.stream.current.test("name:endtrans"):
+                block_name = (
+                    parser.stream.current.value
+                    if parser.stream.current.type == "name"
+                    else None
+                )
+                if block_name == "endtrans":
                     break
-                elif parser.stream.current.test("name:pluralize"):
+                elif block_name == "pluralize":
                     if allow_pluralize:
                         break
                     parser.fail(
                         "a translatable section can have only one pluralize section"
                     )
+                elif block_name == "trans":
+                    parser.fail(
+                        "trans blocks can't be nested; did you mean `endtrans`?"
+                    )
                 parser.fail(
-                    "control structures in translatable sections are not allowed"
+                    f"control structures in translatable sections are not allowed; "
+                    f"saw `{block_name}`"
                 )
             elif parser.stream.eos:
                 parser.fail("unclosed translation block")
index 2e842e0ab54a237118d1e4273b245aec4ff4f872..0b48ca2586949702859564a1133ab9be6f85b49d 100644 (file)
@@ -7,6 +7,7 @@ from jinja2 import DictLoader
 from jinja2 import Environment
 from jinja2 import nodes
 from jinja2 import pass_context
+from jinja2 import TemplateSyntaxError
 from jinja2.exceptions import TemplateAssertionError
 from jinja2.ext import Extension
 from jinja2.lexer import count_newlines
@@ -468,6 +469,18 @@ class TestInternationalization:
             (3, "npgettext", ("babel", "%(users)s user", "%(users)s users", None), []),
         ]
 
+    def test_nested_trans_error(self):
+        s = "{% trans %}foo{% trans %}{% endtrans %}"
+        with pytest.raises(TemplateSyntaxError) as excinfo:
+            i18n_env.from_string(s)
+        assert "trans blocks can't be nested" in str(excinfo.value)
+
+    def test_trans_block_error(self):
+        s = "{% trans %}foo{% wibble bar %}{% endwibble %}{% endtrans %}"
+        with pytest.raises(TemplateSyntaxError) as excinfo:
+            i18n_env.from_string(s)
+        assert "saw `wibble`" in str(excinfo.value)
+
 
 class TestScope:
     def test_basic_scope_behavior(self):