diff --git a/account_reconcile_bg/i18n/es.po b/account_reconcile_bg/i18n/es.po
new file mode 100644
index 00000000..bc0aa30d
--- /dev/null
+++ b/account_reconcile_bg/i18n/es.po
@@ -0,0 +1,104 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * account_reconcile_bg
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 19.0+e\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-01 12:16+0000\n"
+"PO-Revision-Date: 2026-06-01 12:16+0000\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. module: account_reconcile_bg
+#: model:ir.model,name:account_reconcile_bg.model_bg_job
+msgid "Background Job"
+msgstr ""
+
+#. module: account_reconcile_bg
+#. odoo-python
+#: code:addons/account_reconcile_bg/models/account_bank_statement_line.py:0
+msgid "Bank Reconciliation: %s"
+msgstr ""
+
+#. module: account_reconcile_bg
+#: model:ir.model,name:account_reconcile_bg.model_account_bank_statement_line
+msgid "Bank Statement Line"
+msgstr ""
+
+#. module: account_reconcile_bg
+#. odoo-python
+#: code:addons/account_reconcile_bg/models/account_bank_statement_line.py:0
+msgid ""
+"Bank reconciliation completed successfully:
%s"
+msgstr ""
+
+#. module: account_reconcile_bg
+#. odoo-python
+#: code:addons/account_reconcile_bg/models/account_bank_statement_line.py:0
+msgid ""
+"Bank reconciliation failed:
%s
Error: %s"
+msgstr ""
+
+#. module: account_reconcile_bg
+#. odoo-python
+#: code:addons/account_reconcile_bg/models/account_bank_statement_line.py:0
+msgid ""
+"Cannot modify payment lines that are being reconciled in background. Please wait until the reconciliation process is complete.\n"
+"Journal Entry (id): %(entry)s (%(id)s)"
+msgstr ""
+
+#. module: account_reconcile_bg
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_account_bank_statement_line__display_name
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_account_move_line__display_name
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_bg_job__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: account_reconcile_bg
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_account_bank_statement_line__id
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_account_move_line__id
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_bg_job__id
+msgid "ID"
+msgstr ""
+
+#. module: account_reconcile_bg
+#: model:ir.model.fields,help:account_reconcile_bg.field_account_bank_statement_line__reconciliation_in_background
+#: model:ir.model.fields,help:account_reconcile_bg.field_account_move_line__reconciliation_in_background
+msgid "Indicates that this line is being reconciled in background"
+msgstr ""
+
+#. module: account_reconcile_bg
+#: model:ir.model,name:account_reconcile_bg.model_account_move_line
+msgid "Journal Item"
+msgstr ""
+
+#. module: account_reconcile_bg
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_account_bank_statement_line__reconciliation_in_background
+#: model:ir.model.fields,field_description:account_reconcile_bg.field_account_move_line__reconciliation_in_background
+msgid "Reconciliation in Background"
+msgstr ""
+
+#. module: account_reconcile_bg
+#. odoo-python
+#: code:addons/account_reconcile_bg/models/account_bank_statement_line.py:0
+msgid ""
+"This reconciliation is already being processed in background. Please wait "
+"until it finishes."
+msgstr ""
+
+#. module: account_reconcile_bg
+#. odoo-python
+#: code:addons/account_reconcile_bg/models/account_bank_statement_line.py:0
+msgid ""
+"This reconciliation is being processed in background. You will be notified "
+"when it's done."
+msgstr ""
diff --git a/mail_ux/__manifest__.py b/mail_ux/__manifest__.py
index 0ed1d1f7..44ec6876 100644
--- a/mail_ux/__manifest__.py
+++ b/mail_ux/__manifest__.py
@@ -30,6 +30,7 @@
"assets": {
"web.assets_backend": [
"mail_ux/static/src/core/common/**/*",
+ "mail_ux/static/src/views/composer_onchange.js",
],
},
"depends": [
diff --git a/mail_ux/static/src/views/composer_onchange.js b/mail_ux/static/src/views/composer_onchange.js
new file mode 100644
index 00000000..86a71d54
--- /dev/null
+++ b/mail_ux/static/src/views/composer_onchange.js
@@ -0,0 +1,27 @@
+import { ORM } from "@web/core/orm_service";
+import { patch } from "@web/core/utils/patch";
+
+// The composer dialog is rebuilt when an overlay (e.g. a tooltip) changes while it loads,
+// which sends the same initial onchange again: reuse the pending one.
+const pendingComposerOnchanges = new Map();
+
+patch(ORM.prototype, {
+ call(model, method, args = [], kwargs = {}) {
+ const isInitialComposerOnchange =
+ model === "mail.compose.message" &&
+ method === "onchange" &&
+ Array.isArray(args[2]) &&
+ !args[2].length;
+ if (!isInitialComposerOnchange) {
+ return super.call(...arguments);
+ }
+ const key = JSON.stringify([args, kwargs]);
+ let prom = pendingComposerOnchanges.get(key);
+ if (!prom) {
+ prom = super.call(...arguments);
+ pendingComposerOnchanges.set(key, prom);
+ prom.finally(() => pendingComposerOnchanges.delete(key)).catch(() => {});
+ }
+ return prom.then((result) => structuredClone(result));
+ },
+});
diff --git a/portal_ux/i18n/es.po b/portal_ux/i18n/es.po
new file mode 100644
index 00000000..2d261cc1
--- /dev/null
+++ b/portal_ux/i18n/es.po
@@ -0,0 +1,43 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * portal_ux
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 19.0+e\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-07-22 13:48+0000\n"
+"PO-Revision-Date: 2026-07-22 13:48+0000\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. module: portal_ux
+#: model:ir.model.fields,field_description:portal_ux.field_portal_wizard__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: portal_ux
+#: model_terms:ir.ui.view,arch_db:portal_ux.wizard_view
+msgid "Grant Access to All"
+msgstr ""
+
+#. module: portal_ux
+#: model:ir.model,name:portal_ux.model_portal_wizard
+msgid "Grant Portal Access"
+msgstr ""
+
+#. module: portal_ux
+#: model:ir.model.fields,field_description:portal_ux.field_portal_wizard__id
+msgid "ID"
+msgstr ""
+
+#. module: portal_ux
+#: model_terms:ir.ui.view,arch_db:portal_ux.wizard_view
+msgid ""
+"This button will grant access to all contacts with a valid email address."
+msgstr ""
diff --git a/whatsapp_ux/i18n/es.po b/whatsapp_ux/i18n/es.po
new file mode 100644
index 00000000..0186c98e
--- /dev/null
+++ b/whatsapp_ux/i18n/es.po
@@ -0,0 +1,52 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * whatsapp_ux
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 19.0+e\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-07-23 15:36+0000\n"
+"PO-Revision-Date: 2026-07-23 15:36+0000\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. module: whatsapp_ux
+#: model:ir.model.fields,help:whatsapp_ux.field_whatsapp_template__bulk_send_action
+msgid ""
+"Automatically create a one-click bulk send server action on the list view of"
+" this template's model once the template is approved. The action reuses the "
+"native WhatsApp batch queue, so it sends the template to every selected "
+"record at once."
+msgstr ""
+
+#. module: whatsapp_ux
+#: model:ir.model.fields,field_description:whatsapp_ux.field_whatsapp_template__bulk_send_action
+msgid "Bulk Send Action"
+msgstr ""
+
+#. module: whatsapp_ux
+#: model:ir.model.fields,field_description:whatsapp_ux.field_whatsapp_template__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: whatsapp_ux
+#: model:ir.model.fields,field_description:whatsapp_ux.field_whatsapp_template__id
+msgid "ID"
+msgstr ""
+
+#. module: whatsapp_ux
+#. odoo-python
+#: code:addons/whatsapp_ux/models/whatsapp_template.py:0
+msgid "Send by WhatsApp: %s"
+msgstr ""
+
+#. module: whatsapp_ux
+#: model:ir.model,name:whatsapp_ux.model_whatsapp_template
+msgid "WhatsApp Template"
+msgstr ""