diff --git a/odoo/addons/base/tests/test_translate.py b/odoo/addons/base/tests/test_translate.py index 0006c831e67..beda9616116 100644 --- a/odoo/addons/base/tests/test_translate.py +++ b/odoo/addons/base/tests/test_translate.py @@ -1022,6 +1022,28 @@ class TestXMLTranslation(TransactionCase): self.assertEqual(view.with_env(env_fr).arch_db, archf % terms_fr) self.assertEqual(view.with_env(env_nl).arch_db, archf % terms_nl) + def test_sync_text_to_xml(self): + """ Check translations of 'arch' after xml tags changes in source terms. """ + archf = '
%s
' + terms_en = ('Hi',) + terms_fr = ('Salut',) + terms_nl = ('Hallo',) + view = self.create_view(archf, terms_en, en_US=terms_en, fr_FR=terms_fr, nl_NL=terms_nl) + + env_nolang = self.env(context={}) + env_en = self.env(context={'lang': 'en_US'}) + env_fr = self.env(context={'lang': 'fr_FR'}) + + # modify the arch view, keep the same text content: 'Hi' + terms_en = 'Hi' + archf = '
' + view.with_env(env_en).write({'arch_db': archf % terms_en}) + + self.assertEqual(view.with_env(env_nolang).arch_db, archf % terms_en) + self.assertEqual(view.with_env(env_en).arch_db, archf % terms_en) + # check that we didn't set string="<span>Salut</span>" + self.assertEqual(view.with_env(env_fr).arch_db, archf % terms_en) + def test_sync_xml_collision(self): """ Check translations of 'arch' after xml tags changes in source terms when the same term appears in different elements with different diff --git a/odoo/fields.py b/odoo/fields.py index 6a316689f9c..100ed964bc6 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -1822,7 +1822,10 @@ class _String(Field): matches = get_close_matches(old_term_text, text2terms, 1, 0.9) if matches: closest_term = get_close_matches(old_term, text2terms[matches[0]], 1, 0)[0] - translation_dictionary[closest_term] = translation_dictionary.pop(old_term) + old_is_text = old_term == self.get_text_content(old_term) + closest_is_text = closest_term == self.get_text_content(closest_term) + if old_is_text or not closest_is_text: + translation_dictionary[closest_term] = translation_dictionary.pop(old_term) # pylint: disable=not-callable new_translations = { l: self.translate(lambda term: translation_dictionary.get(term, {l: None})[l], cache_value)