diff --git a/babel/messages/extract.py b/babel/messages/extract.py index f0584d460..c03b8cca0 100644 --- a/babel/messages/extract.py +++ b/babel/messages/extract.py @@ -835,10 +835,12 @@ def parse_template_string( if level: expression_contents += character if not inside_str: - if character == '{' and prev_character == '$': + # start of new template string or object definition + if character == '{': level += 1 elif level and character == '}': level -= 1 + # end of template string if level == 0 and expression_contents: expression_contents = expression_contents[0:-1] fake_file_obj = io.BytesIO(expression_contents.encode()) diff --git a/tests/messages/test_js_extract.py b/tests/messages/test_js_extract.py index fc643851e..f234a80e4 100644 --- a/tests/messages/test_js_extract.py +++ b/tests/messages/test_js_extract.py @@ -191,3 +191,13 @@ def test_inside_nested_template_string(): ) assert messages == [(1, 'Greetings!', [], None), (1, 'This is a lovely evening.', [], None), (1, 'The day is really nice!', [], None)] + + +def test_template_string_with_parameters() -> None: + buf = BytesIO( + b'`${gettext("text %(param)s", { param: myVar })}`;', + ) + messages = list(extract.extract("javascript", buf, {"gettext": None}, [], {"parse_template_string": True})) + assert messages == [ + (1, "text %(param)s", [], None), + ]