diff --git a/odoo/addons/base/models/ir_translation.py b/odoo/addons/base/models/ir_translation.py index 15d03256ea5..940708ea0b7 100644 --- a/odoo/addons/base/models/ir_translation.py +++ b/odoo/addons/base/models/ir_translation.py @@ -488,6 +488,8 @@ class IrTranslation(models.Model): for translation in translations: if translation.src == translation.value: discarded += translation + # consider it done to avoid being matched against another term + done.add((translation.src, translation.lang)) elif translation.src in terms: done.add((translation.src, translation.lang)) else: diff --git a/odoo/addons/base/tests/test_translate.py b/odoo/addons/base/tests/test_translate.py index a6cbcc2d52a..2d3275142f1 100644 --- a/odoo/addons/base/tests/test_translate.py +++ b/odoo/addons/base/tests/test_translate.py @@ -406,3 +406,31 @@ class TestXMLTranslation(TransactionCase): self.assertEqual(view.with_env(env_en).arch_db, archf % terms_en) 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_update(self): + """ Check translations after minor change in source terms. """ + archf = '
%s
%s
' + terms_src = ('Subtotal', 'Subtotal:') + terms_en = ('Subtotal', 'Sub total:') + view = self.create_view(archf, terms_src, en_US=terms_en) + + translations = self.env['ir.translation'].search([ + ('type', '=', 'model_terms'), + ('name', '=', "ir.ui.view,arch_db"), + ('res_id', '=', view.id), + ]) + self.assertEqual(len(translations), 2) + + # modifying the arch should sync existing translations without errors + view.write({ + "arch": archf % ('Subtotal', 'Subtotal:
') + }) + + translations = self.env['ir.translation'].search([ + ('type', '=', 'model_terms'), + ('name', '=', "ir.ui.view,arch_db"), + ('res_id', '=', view.id), + ]) + # 'Subtotal' being src==value, it will be discared + # 'Subtotal:' will be discarded as it match 'Subtotal' instead of 'Subtotal:
' + self.assertEqual(len(translations), 0)