[REF] translation: better get_po_paths

make the tool function get_po_paths to reduce duplicated code

Part-of: odoo/odoo#134785
This commit is contained in:
Chong Wang (cwg)
2023-09-18 22:17:02 +00:00
committed by Martin Trigaux
parent dccc8f39d0
commit 007d2bde2a
3 changed files with 27 additions and 77 deletions
+4 -24
View File
@@ -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)
+7 -37
View File
@@ -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)
+16 -16
View File
@@ -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: