ci(semgrep): fix false positives (#25823)

diff --git a/.github/helper/semgrep_rules/translate.py b/.github/helper/semgrep_rules/translate.py
index bd6cd91..9de6aa9 100644
--- a/.github/helper/semgrep_rules/translate.py
+++ b/.github/helper/semgrep_rules/translate.py
@@ -51,3 +51,11 @@
 _("")
 # ruleid: frappe-translation-empty-string
 _('')
+
+
+class Test:
+	# ok: frappe-translation-python-splitting
+	def __init__(
+			args
+			):
+		pass
diff --git a/.github/helper/semgrep_rules/translate.yml b/.github/helper/semgrep_rules/translate.yml
index fa4ec9e..5f03fb9 100644
--- a/.github/helper/semgrep_rules/translate.yml
+++ b/.github/helper/semgrep_rules/translate.yml
@@ -44,8 +44,8 @@
   pattern-either:
   - pattern: _(...) + _(...)
   - pattern: _("..." + "...")
-  - pattern-regex: '_\([^\)]*\\\s*'    # lines broken by `\`
-  - pattern-regex: '_\(\s*\n'          # line breaks allowed by python for using ( )
+  - pattern-regex: '[\s\.]_\([^\)]*\\\s*'    # lines broken by `\`
+  - pattern-regex: '[\s\.]_\(\s*\n'          # line breaks allowed by python for using ( )
   message: |
     Do not split strings inside translate function. Do not concatenate using translate functions.
     Please refer: https://frappeframework.com/docs/user/en/translations
diff --git a/.github/helper/semgrep_rules/ux.js b/.github/helper/semgrep_rules/ux.js
new file mode 100644
index 0000000..ae73f9c
--- /dev/null
+++ b/.github/helper/semgrep_rules/ux.js
@@ -0,0 +1,9 @@
+
+// ok: frappe-missing-translate-function-js
+frappe.msgprint('{{ _("Both login and password required") }}');
+
+// ruleid: frappe-missing-translate-function-js
+frappe.msgprint('What');
+
+// ok: frappe-missing-translate-function-js
+frappe.throw('  {{ _("Both login and password required") }}.  ');
diff --git a/.github/helper/semgrep_rules/ux.py b/.github/helper/semgrep_rules/ux.py
index 4a74457..a00d3cd 100644
--- a/.github/helper/semgrep_rules/ux.py
+++ b/.github/helper/semgrep_rules/ux.py
@@ -2,30 +2,30 @@
 from frappe import msgprint, throw, _
 
 
-# ruleid: frappe-missing-translate-function
+# ruleid: frappe-missing-translate-function-python
 throw("Error Occured")
 
-# ruleid: frappe-missing-translate-function
+# ruleid: frappe-missing-translate-function-python
 frappe.throw("Error Occured")
 
-# ruleid: frappe-missing-translate-function
+# ruleid: frappe-missing-translate-function-python
 frappe.msgprint("Useful message")
 
-# ruleid: frappe-missing-translate-function
+# ruleid: frappe-missing-translate-function-python
 msgprint("Useful message")
 
 
-# ok: frappe-missing-translate-function
+# ok: frappe-missing-translate-function-python
 translatedmessage = _("Hello")
 
-# ok: frappe-missing-translate-function
+# ok: frappe-missing-translate-function-python
 throw(translatedmessage)
 
-# ok: frappe-missing-translate-function
+# ok: frappe-missing-translate-function-python
 msgprint(translatedmessage)
 
-# ok: frappe-missing-translate-function
+# ok: frappe-missing-translate-function-python
 msgprint(_("Helpful message"))
 
-# ok: frappe-missing-translate-function
+# ok: frappe-missing-translate-function-python
 frappe.throw(_("Error occured"))
diff --git a/.github/helper/semgrep_rules/ux.yml b/.github/helper/semgrep_rules/ux.yml
index ed06a6a..dd667f3 100644
--- a/.github/helper/semgrep_rules/ux.yml
+++ b/.github/helper/semgrep_rules/ux.yml
@@ -1,15 +1,30 @@
 rules:
-- id: frappe-missing-translate-function
+- id: frappe-missing-translate-function-python
   pattern-either:
   - patterns:
       - pattern: frappe.msgprint("...", ...)
       - pattern-not: frappe.msgprint(_("..."), ...)
-      - pattern-not: frappe.msgprint(__("..."), ...)
   - patterns:
       - pattern: frappe.throw("...", ...)
       - pattern-not: frappe.throw(_("..."), ...)
-      - pattern-not: frappe.throw(__("..."), ...)
   message: |
       All user facing text must be wrapped in translate function. Please refer to translation documentation. https://frappeframework.com/docs/user/en/guides/basics/translations
-  languages: [python, javascript, json]
+  languages: [python]
+  severity: ERROR
+
+- id: frappe-missing-translate-function-js
+  pattern-either:
+  - patterns:
+      - pattern: frappe.msgprint("...", ...)
+      - pattern-not: frappe.msgprint(__("..."), ...)
+      # ignore microtemplating e.g. msgprint("{{ _("server side translation") }}")
+      - pattern-not: frappe.msgprint("=~/\{\{.*\_.*\}\}/i", ...)
+  - patterns:
+      - pattern: frappe.throw("...", ...)
+      - pattern-not: frappe.throw(__("..."), ...)
+      # ignore microtemplating
+      - pattern-not: frappe.throw("=~/\{\{.*\_.*\}\}/i", ...)
+  message: |
+      All user facing text must be wrapped in translate function. Please refer to translation documentation. https://frappeframework.com/docs/user/en/guides/basics/translations
+  languages: [javascript]
   severity: ERROR