From 1bb3630fb5293c74948a1f42e7bc745dfd93e37c Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Fri, 1 Nov 2024 15:13:39 +0000 Subject: [PATCH] [FIX] account_chart_update_multilang: proper translating of HTML fields The algorithm to translate them is done by terms, which is a bit clunky for our use case. However, since `account.fiscal.position.template`'s note field is Text, not Html, and that's the one we care about, we can predict that the Html version will just wrap it with a

tag. Well, in short, it's ugly but works. MT-7597 --- .../static/description/index.html | 11 ++++--- .../wizards/wizard_chart_update.py | 31 ++++++++++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/account_chart_update_multilang/static/description/index.html b/account_chart_update_multilang/static/description/index.html index d3bcbe7b8..a5a8b9be5 100644 --- a/account_chart_update_multilang/static/description/index.html +++ b/account_chart_update_multilang/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ pre.literal-block, pre.doctest-block, pre.math, pre.code { margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.option { span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -434,7 +435,9 @@ If you spotted it first, help us to smash it by providing a detailed and welcome

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

diff --git a/account_chart_update_multilang/wizards/wizard_chart_update.py b/account_chart_update_multilang/wizards/wizard_chart_update.py index 3c39f05ba..697756fca 100644 --- a/account_chart_update_multilang/wizards/wizard_chart_update.py +++ b/account_chart_update_multilang/wizards/wizard_chart_update.py @@ -1,28 +1,45 @@ # Copyright 2024 Moduon Team S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3.0) -from odoo import models +from odoo import fields, models from odoo.tools import ormcache class WizardUpdateChartsAccount(models.TransientModel): _inherit = "wizard.update.charts.accounts" + lang = fields.Selection(default="en_US") + @ormcache("self.lang") def _other_langs(self): return self.env["res.lang"].search([("code", "!=", self.lang)]).mapped("code") + def _get_lang_selection_options(self): + """Only can translate in base language by default.""" + en = self.env["res.lang"]._lang_get("en_US") + return [(en.code, en.name)] + def _update_other_langs(self, templates): - for _, tpl_xmlid in templates.get_external_id().items(): + for tpl_xmlid in templates.get_external_id().values(): template = self.env.ref(tpl_xmlid) module, xmlid = tpl_xmlid.split(".", 1) rec_xmlid = f"{module}.{self.company_id.id}_{xmlid}" rec = self.env.ref(rec_xmlid) - for lang in self._other_langs(): - lang_tpl = template.with_context(lang=lang) - for key in self._diff_translate_fields(template, rec): - lang_rec = rec.with_context(lang=lang) - lang_rec[key] = lang_tpl[key] + translations = {} + for key in self._diff_translate_fields(template, rec): + for lang in self._other_langs(): + field = rec._fields[key] + old_value = field._get_stored_translations(rec).get( + rec.env.lang, "en_US" + ) + if old_value.startswith("

") and old_value.endswith("

"): + old_value = old_value[3:-4] + is_callable = callable(field.translate) + translated = template.with_context(lang=lang)[key] + translations[lang] = ( + {old_value: translated} if is_callable else translated + ) + rec.update_field_translations(key, translations) def _diff_translate_fields(self, template, real): """Find differences by comparing the translations of the fields."""