diff --git a/frappe/core/doctype/translation/test_translation.py b/frappe/core/doctype/translation/test_translation.py
index 33c3200ada..d534f43f2a 100644
--- a/frappe/core/doctype/translation/test_translation.py
+++ b/frappe/core/doctype/translation/test_translation.py
@@ -92,6 +92,12 @@ class TestTranslation(IntegrationTestCase):
self.assertTrue(_(source), target)
+ def test_html_message_translations(self):
+ """Test fallback for messages w/ HTML Tags"""
+ message = "Hide descendant records of For Value."
+ translated_message = "隐藏下层节点值"
+ self.assertEqual(_(message, lang="zh"), translated_message)
+
def get_translation_data():
html_source_data = """
diff --git a/frappe/utils/translations.py b/frappe/utils/translations.py
index 93f739a39c..4c9bc3f4b2 100644
--- a/frappe/utils/translations.py
+++ b/frappe/utils/translations.py
@@ -16,6 +16,8 @@ def _(msg: str, lang: str | None = None, context: str | None = None) -> str:
if not lang:
lang = frappe.local.lang
+ all_translations = get_all_translations(lang)
+
non_translated_string = msg
if is_html(msg):
@@ -24,17 +26,23 @@ def _(msg: str, lang: str | None = None, context: str | None = None) -> str:
# msg should always be unicode
msg = frappe.as_unicode(msg).strip()
- translated_string = ""
+ msg_with_html = frappe.as_unicode(non_translated_string).strip()
+ msg_list = [msg, msg_with_html]
- all_translations = get_all_translations(lang)
- if context:
- string_key = f"{msg}:{context}"
- translated_string = all_translations.get(string_key)
+ for msg in msg_list:
+ translated_string = ""
- if not translated_string:
- translated_string = all_translations.get(msg)
+ if context:
+ string_key = f"{msg}:{context}"
+ translated_string = all_translations.get(string_key)
- return translated_string or non_translated_string
+ if not translated_string:
+ translated_string = all_translations.get(msg)
+
+ if translated_string:
+ return translated_string
+
+ return non_translated_string
def _lt(msg: str, lang: str | None = None, context: str | None = None):