[ADD] transifex: integration module

Create a new module to directly find a source term on Transifex

This will not make translation easier but improve the collaboration and allow
easily to find a source term.
This commit is contained in:
Martin Trigaux
2017-09-25 15:26:54 +02:00
parent eb75cb09b5
commit 7e205ea6a9
7 changed files with 157 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
+28
View File
@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Transifex integration',
'version': '1.0',
'summary': 'Add a link to edit a translation in Transifex',
'category': 'Extra Tools',
'description':
"""
Transifex integration
=====================
This module will add a link to the Transifex project in the translation view.
The purpose of this module is to speed up translations of the main modules.
To work, Odoo uses Transifex configuration files `.tx/config` to detec the
project source. Custom modules will not be translated (as not published on
the main Transifex project).
The language the user tries to translate must be activated on the Transifex
project.
""",
'data': [
'data/transifex_data.xml',
'data/ir_translation_view.xml',
],
'depends': ['base'],
}
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="ir_translation_view_tree_transifex" model="ir.ui.view">
<field name="name">ir.translation.transifex</field>
<field name="model">ir.translation</field>
<field name="inherit_id" ref="base.view_translation_tree"/>
<field name="arch" type="xml">
<field name="lang" position="after">
<field name="transifex_url"
widget="link_button"
string="Transifex" />
</field>
</field>
</record>
<record id="ir_translation_dialog_view_tree_transifex" model="ir.ui.view">
<field name="name">ir.translation.transifex</field>
<field name="model">ir.translation</field>
<field name="inherit_id" ref="base.view_translation_dialog_tree"/>
<field name="arch" type="xml">
<field name="lang" position="after">
<field name="transifex_url"
widget="link_button"
string="Transifex" />
</field>
</field>
</record>
</odoo>
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="transifex_project_url" model="ir.config_parameter">
<field name="key">transifex.project_url</field>
<field name="value">https://www.transifex.com/odoo</field>
</record>
</odoo>
+4
View File
@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import ir_translation
+84
View File
@@ -0,0 +1,84 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from configparser import ConfigParser
from os.path import join as opj
import os
import werkzeug
from odoo import models, fields
from odoo.modules.module import ad_paths
class IrTranslation(models.Model):
_inherit = 'ir.translation'
transifex_url = fields.Char("Transifex URL", compute='_get_transifex_url')
def _get_transifex_url(self):
""" Construct transifex URL based on the module on configuration """
# e.g. 'https://www.transifex.com/odoo/'
base_url = self.env['ir.config_parameter'].sudo().get_param('transifex.project_url')
tx_config_file = ConfigParser()
tx_sections = []
for addon_path in ad_paths:
tx_path = opj(addon_path, '.tx', 'config')
if os.path.isfile(tx_path):
tx_config_file.read(tx_path)
# first section is [main], after [odoo-11.sale]
tx_sections.extend(tx_config_file.sections()[1:])
# parent directory ad .tx/config is root directory in odoo/odoo
tx_path = opj(addon_path, os.pardir, '.tx', 'config')
if os.path.isfile(tx_path):
tx_config_file.read(tx_path)
tx_sections.extend(tx_config_file.sections()[1:])
if not base_url or not tx_sections:
self.transifex_url = False
else:
base_url = base_url.rstrip('/')
# will probably be the same for all terms, avoid multiple searches
translation_languages = list(set(self.mapped('lang')))
languages = self.env['res.lang'].with_context(active_test=False).search(
[('code', 'in', translation_languages)])
language_codes = dict((l.code, l.iso_code) for l in languages)
# .tx/config files contains the project reference
# using ini files like '[odoo-master.website_sale]'
translation_modules = set(self.mapped('module'))
project_modules = {}
for module in translation_modules:
for section in tx_sections:
tx_project, tx_mod = section.split('.')
if tx_mod == module:
project_modules[module] = tx_project
for translation in self:
if not translation.module or not translation.source or translation.lang == 'en_US':
# custom or source term
translation.transifex_url = False
continue
lang_code = language_codes.get(translation.lang)
if not lang_code:
translation.transifex_url = False
continue
project = project_modules.get(translation.module)
if not project:
translation.transifex_url = False
continue
# e.g. 'https://www.transifex.com/odoo/odoo-10/translate/#fr/sale/42?q=Sale+Order'
translation.transifex_url = "%(url)s/%(project)s/translate/#%(lang)s/%(module)s/42?q=%(src)s" % {
'url': base_url,
'project': project,
'lang': lang_code,
'module': translation.module,
'src': werkzeug.url_quote_plus(translation.source[:50]),
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB