transifex/models/transifex_translation.py

86 lines
3.2 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import werkzeug.urls
from configparser import ConfigParser
from os import pardir
from os.path import isfile, join as opj
import odoo
from odoo import models, tools
class TransifexTranslation(models.AbstractModel):
_name = "transifex.translation"
_description = "Transifex Translation"
@tools.ormcache()
def _get_transifex_projects(self):
""" get the transifex project name for each module
.tx/config files contains the project reference
first section is [main], after '[odoo-16.sale]'
:rtype: dict
:return: {module_name: tx_project_name}
"""
tx_config_file = ConfigParser()
projects = {}
for addon_path in odoo.addons.__path__:
for tx_path in (
opj(addon_path, '.tx', 'config'),
opj(addon_path, pardir, '.tx', 'config'),
):
if isfile(tx_path):
tx_config_file.read(tx_path)
for sec in tx_config_file.sections()[1:]:
if len(sec.split(":")) != 6:
# old format ['main', 'odoo-16.base', ...]
tx_project, tx_mod = sec.split(".")
else:
# tx_config_file.sections(): ['main', 'o:odoo:p:odoo-16:r:base', ...]
_, _, _, tx_project, _, tx_mod = sec.split(':')
projects[tx_mod] = tx_project
return projects
def _update_transifex_url(self, translations):
""" Update translations' Transifex URL
:param translations: the translations to update, may be a recordset or a list of dicts.
The elements of `translations` must have the fields/keys 'source', 'module', 'lang',
and the field/key 'transifex_url' is updated on them.
"""
# e.g. 'https://www.transifex.com/odoo/'
base_url = self.env['ir.config_parameter'].sudo().get_param('transifex.project_url')
if not base_url:
return
base_url = base_url.rstrip('/')
res_langs = self.env['res.lang'].search([])
lang_to_iso = {l.code: l.iso_code for l in res_langs}
if not lang_to_iso:
return
projects = self._get_transifex_projects()
if not projects:
return
for translation in translations:
if not translation['source'] or translation['lang'] == 'en_US':
continue
lang_iso = lang_to_iso.get(translation['lang'])
if not lang_iso:
continue
project = projects.get(translation['module'])
if not project:
continue
# e.g. https://www.transifex.com/odoo/odoo-16/translate/#fr_FR/sale/42?q=text:'Sale+Order'
# 42 is an arbitrary number to satisfy the transifex URL format
source = werkzeug.urls.url_quote_plus(translation['source'][:50].replace("\n", "").replace("'", "\\'"))
source = f"'{source}'" if "+" in source else source
translation['transifex_url'] = f"{base_url}/{project}/translate/#{lang_iso}/{translation['module']}/42?q=text%3A{source}"