From 3f0fb5e09c84b844d1aa72449cdcf953068aa10a Mon Sep 17 00:00:00 2001 From: Nicolas Lempereur Date: Wed, 24 Mar 2021 14:11:46 +0000 Subject: [PATCH] [FIX] base: generate missing terms ok src dupes When using "Generate Missing Terms" we export all translations and reimport them with `create_empty_translation` so they empty translation are made available. But since we export all modules in the same PO file, the same terms that might have different translation in different modules would get the same translation value after using "Generate missing terms" which is unexpected => usually we import/export PO file by module and so a term translation is unique for one module only. With this changeset, we import translation module by module. When testing speed of Generate Missing Terms with 90 modules and 37000 translations, the timing taken change like this: - original code: 21 seconds - exporting/importing 1 PO file per module: 45 seconds - exporting 1 TGZ file total/importing 1 PO file per module: 23 seconds opw-2439029 closes odoo/odoo#68801 X-original-commit: 240de08ac8f5dbd2e263a48fea859605770f82a3 Signed-off-by: Nicolas Lempereur (nle) --- odoo/addons/base/wizard/base_update_translations.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/odoo/addons/base/wizard/base_update_translations.py b/odoo/addons/base/wizard/base_update_translations.py index 0ac9b301d7b..40a99f4f133 100644 --- a/odoo/addons/base/wizard/base_update_translations.py +++ b/odoo/addons/base/wizard/base_update_translations.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import tarfile import tempfile from odoo import api, fields, models, tools, _ @@ -27,6 +28,11 @@ class BaseUpdateTranslations(models.TransientModel): def act_update(self): with tempfile.NamedTemporaryFile() as buf: - tools.trans_export(self.lang, ['all'], buf, 'po', self._cr) - tools.trans_load_data(self._cr, buf, 'po', self.lang, create_empty_translation=True) + tools.trans_export(self.lang, ['all'], buf, 'tgz', self._cr) + buf.seek(0) + tar = tarfile.open(fileobj=buf) + for file_info in tar: + module_file = tar.extractfile(file_info) + tools.trans_load_data(self._cr, module_file, 'po', self.lang, create_empty_translation=True) + tar.close() return {'type': 'ir.actions.act_window_close'}