From 35fc833d63ff1ca9524523d1179e3c51c731cc07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20=C5=BDurek?= Date: Tue, 22 Jul 2025 23:56:59 +0200 Subject: [PATCH] Extract parametrized gettext from javascript files --- babel/messages/extract.py | 4 +++- tests/messages/test_js_extract.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/babel/messages/extract.py b/babel/messages/extract.py index 6fad84304..498d02c55 100644 --- a/babel/messages/extract.py +++ b/babel/messages/extract.py @@ -917,10 +917,12 @@ def parse_template_string( if level: expression_contents += character if not inside_str: - if character == '{' and prev_character == '$': + # start of `${...}` interpolation, or a nested `{` already inside one + if character == '{' and (level or prev_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..0023a0b7f 100644 --- a/tests/messages/test_js_extract.py +++ b/tests/messages/test_js_extract.py @@ -191,3 +191,21 @@ 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), + ] + + +def test_template_string_with_literal_braces() -> None: + buf = BytesIO( + b'hello(`there is {nothing} to worry about`);', + ) + messages = list(extract.extract("javascript", buf, {"gettext": None}, [], {"parse_template_string": True})) + assert messages == []