From 007d2bde2a79b1864946c7e2a3dbe24fa3c8c5de Mon Sep 17 00:00:00 2001 From: "Chong Wang (cwg)" Date: Mon, 11 Sep 2023 12:07:00 +0200 Subject: [PATCH] [REF] translation: better get_po_paths make the tool function get_po_paths to reduce duplicated code Part-of: odoo/odoo#134785 --- addons/mail/models/template_reset_mixin.py | 28 ++------------ odoo/addons/base/models/ir_module.py | 44 ++++------------------ odoo/tools/translate.py | 32 ++++++++-------- 3 files changed, 27 insertions(+), 77 deletions(-) diff --git a/addons/mail/models/template_reset_mixin.py b/addons/mail/models/template_reset_mixin.py index f37756a0b23..aac6a0c6875 100644 --- a/addons/mail/models/template_reset_mixin.py +++ b/addons/mail/models/template_reset_mixin.py @@ -11,7 +11,7 @@ from odoo.modules import get_module_resource from odoo.modules.module import get_resource_from_path, get_resource_path from odoo.tools.convert import xml_import from odoo.tools.misc import file_open -from odoo.tools.translate import TranslationImporter +from odoo.tools.translate import TranslationImporter, get_po_paths class TemplateResetMixin(models.AbstractModel): @@ -62,29 +62,9 @@ class TemplateResetMixin(models.AbstractModel): def _override_translation_term(self, module_name, xml_ids): translation_importer = TranslationImporter(self.env.cr) - for code, _ in self.env['res.lang'].get_installed(): - lang_code = tools.get_iso_codes(code) - # In case of sub languages (e.g fr_BE), load the base language first, (e.g fr.po) and - # then load the main translation file (e.g fr_BE.po) - - # Step 1: reset translation terms with base language file - if '_' in lang_code: - base_lang_code = lang_code.split('_')[0] - base_trans_file = get_module_resource(module_name, 'i18n', base_lang_code + '.po') - if base_trans_file: - translation_importer.load_file(base_trans_file, code, xmlids=xml_ids) - - # Step 1.5: in case of latin america Spanish variation, load es_MX too - if base_lang_code == "es" and lang_code != "es_MX": - mx_trans_file = get_module_resource(module_name, 'i18n', 'es_MX.po') - if mx_trans_file: - translation_importer.load_file(mx_trans_file, code, xmlids=xml_ids) - - # Step 2: reset translation file with main language file (can possibly override the - # terms coming from the base language) - trans_file = get_module_resource(module_name, 'i18n', lang_code + '.po') - if trans_file: - translation_importer.load_file(trans_file, code, xmlids=xml_ids) + for lang, _ in self.env['res.lang'].get_installed(): + for po_path in get_po_paths(module_name, lang): + translation_importer.load_file(po_path, lang, xmlids=xml_ids) translation_importer.save(overwrite=True, force_overwrite=True) diff --git a/odoo/addons/base/models/ir_module.py b/odoo/addons/base/models/ir_module.py index 87c8543c249..cf5d5c8e550 100644 --- a/odoo/addons/base/models/ir_module.py +++ b/odoo/addons/base/models/ir_module.py @@ -30,7 +30,7 @@ from odoo.exceptions import AccessDenied, UserError from odoo.osv import expression from odoo.tools.parse_version import parse_version from odoo.tools.misc import topological_sort, get_flag -from odoo.tools.translate import TranslationImporter +from odoo.tools.translate import TranslationImporter, get_po_paths from odoo.http import request from odoo.modules import get_module_path, get_module_resource @@ -912,42 +912,12 @@ class Module(models.Model): if not modpath: continue for lang in langs: - lang_code = tools.get_iso_codes(lang) - base_lang_code = None - if '_' in lang_code: - base_lang_code = lang_code.split('_')[0] - - # Step 1: for sub-languages, load base language first (e.g. es_CL.po is loaded over es.po) - if base_lang_code: - base_trans_file = get_module_resource(module_name, 'i18n', base_lang_code + '.po') - if base_trans_file: - _logger.info('module %s: loading base translation file %s for language %s', module_name, base_lang_code, lang) - translation_importer.load_file(base_trans_file, lang) - - if base_lang_code == "es" and lang != "es_MX": - mx_trans_file = get_module_resource(module_name, 'i18n', 'es_MX.po') - if mx_trans_file: - _logger.info('module %s: loading translation file %s for language %s', module_name, "es_MX", lang) - translation_importer.load_file(mx_trans_file, lang) - - # i18n_extra folder is for additional translations handle manually (eg: for l10n_be) - base_trans_extra_file = get_module_resource(module_name, 'i18n_extra', base_lang_code + '.po') - if base_trans_extra_file: - _logger.info('module %s: loading extra base translation file %s for language %s', module_name, base_lang_code, lang) - translation_importer.load_file(base_trans_extra_file, lang) - - # Step 2: then load the main translation file, possibly overriding the terms coming from the base language - trans_file = get_module_resource(module_name, 'i18n', lang_code + '.po') - if trans_file: - _logger.info('module %s: loading translation file %s for language %s', module_name, lang_code, lang) - translation_importer.load_file(trans_file, lang) - elif lang_code != 'en_US': - _logger.info('module %s: no translation for language %s', module_name, lang_code) - - trans_extra_file = get_module_resource(module_name, 'i18n_extra', lang_code + '.po') - if trans_extra_file: - _logger.info('module %s: loading extra translation file %s for language %s', module_name, lang_code, lang) - translation_importer.load_file(trans_extra_file, lang) + po_paths = get_po_paths(module_name, lang) + for po_path in po_paths: + _logger.info('module %s: loading translation file %s for language %s', module_name, po_path, lang) + translation_importer.load_file(po_path, lang) + if lang != 'en_US' and not po_paths: + _logger.info('module %s: no translation for language %s', module_name, lang) translation_importer.save(overwrite=overwrite) diff --git a/odoo/tools/translate.py b/odoo/tools/translate.py index dcb796e1f18..29fad6eab2c 100644 --- a/odoo/tools/translate.py +++ b/odoo/tools/translate.py @@ -1472,6 +1472,21 @@ def load_language(cr, lang): installer.lang_install() +def get_po_paths(module_name: str, lang: str): + lang_base = lang.split('_')[0] + langs = [lang_base, lang] # the latter will overwrite the former + if lang_base == "es" and lang != "es_MX": + # force es_MX as fallback language for the different spanish + # es_MX is more actively translated and closer to many languages + langs = [lang_base, "es_MX", lang] + return [ + path + for lang_ in langs + for dir_ in ('i18n', 'i18n_extra') + if (path := get_resource_path(module_name, dir_, lang_ + '.po')) + ] + + class CodeTranslations: def __init__(self): # {(module_name, lang): {src: value}} @@ -1479,21 +1494,6 @@ class CodeTranslations: # {(module_name, lang): {'message': [{'id': src, 'string': value}]} self.web_translations = {} - @staticmethod - def _get_po_paths(mod, lang): - lang_base = lang.split('_')[0] - po_paths = [get_resource_path(mod, 'i18n', lang_base + '.po'), - get_resource_path(mod, 'i18n', lang + '.po'), - get_resource_path(mod, 'i18n_extra', lang_base + '.po'), - get_resource_path(mod, 'i18n_extra', lang + '.po')] - if lang_base == "es" and lang != "es_MX": - # force es_MX as fallback language for the different spanish - # es_MX is more actively translated and closer to many languages - po_paths = [po_paths[0]] + [get_resource_path(mod, 'i18n', 'es_MX.po')] + \ - po_paths[1:3] + [get_resource_path(mod, 'i18n_extra', 'es_MX.po')] + \ - [po_paths[3]] - return [path for path in po_paths if path] - @staticmethod def _read_code_translations_file(fileobj, filter_func): """ read and return code translations from fileobj with filter filter_func @@ -1512,7 +1512,7 @@ class CodeTranslations: @staticmethod def _get_code_translations(module_name, lang, filter_func): - po_paths = CodeTranslations._get_po_paths(module_name, lang) + po_paths = get_po_paths(module_name, lang) translations = {} for po_path in po_paths: try: