aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2024-01-10 14:28:47 -0800
committerGitHub <noreply@github.com>2024-01-10 14:28:47 -0800
commit5c8a10522421270f66376a24ec8e0d6812bc4b14 (patch)
treefdb7c8ac96783d7fc07f0223300e07847bae580f
parent716795349a41d4983a9a4771f7d883c96ea17be7 (diff)
parent19a55db3b411343309f2faaffaedbb089e841895 (diff)
downloadjinja-5c8a10522421270f66376a24ec8e0d6812bc4b14.tar.gz
Make nested-trans-block exceptions nicer (#1918)
-rw-r--r--CHANGES.rst2
-rw-r--r--src/jinja2/ext.py16
-rw-r--r--tests/test_ext.py13
3 files changed, 28 insertions, 3 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index d6688e76..bced976e 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -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
diff --git a/src/jinja2/ext.py b/src/jinja2/ext.py
index 354b4063..fade1fa3 100644
--- a/src/jinja2/ext.py
+++ b/src/jinja2/ext.py
@@ -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")
diff --git a/tests/test_ext.py b/tests/test_ext.py
index 2e842e0a..0b48ca25 100644
--- a/tests/test_ext.py
+++ b/tests/test_ext.py
@@ -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):