Turkesh Patel (openERP) has proposed merging
lp:~openerp-dev/openobject-server/trunk-merge-translation-tpa into
lp:~openerp-dev/openobject-server/trunk-merge-translation.
Requested reviews:
Jigar Amin (OpenERP) (jam-openerp)
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-merge-translation-tpa/+merge/114829
Merge translation services.
--> created new translation web service.
--> added new module field in ir.translation.
--
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-merge-translation-tpa/+merge/114829
Your team OpenERP R&D Team is subscribed to branch
lp:~openerp-dev/openobject-server/trunk-merge-translation.
=== modified file 'openerp/addons/base/ir/ir_translation.py'
--- openerp/addons/base/ir/ir_translation.py 2012-01-24 11:47:30 +0000
+++ openerp/addons/base/ir/ir_translation.py 2012-07-13 10:47:28 +0000
@@ -22,6 +22,7 @@
from osv import fields, osv
import tools
import logging
+import openerp.modules
_logger = logging.getLogger(__name__)
@@ -70,7 +71,6 @@
cr.execute('''CREATE TEMP TABLE %s(
imd_model VARCHAR(64),
- imd_module VARCHAR(64),
imd_name VARCHAR(128)
) INHERITS (%s) ''' % (self._table_name, self._parent_table))
@@ -80,10 +80,10 @@
self._cr.execute("INSERT INTO " + self._table_name \
+ """(name, lang, res_id, src, type,
- imd_model, imd_module, imd_name, value)
+ imd_model, module, imd_name, value)
VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s)""",
(ddict['name'], ddict['lang'], ddict.get('res_id'), ddict['src'], ddict['type'],
- ddict.get('imd_model'), ddict.get('imd_module'), ddict.get('imd_name'),
+ ddict.get('imd_model'), ddict.get('module'), ddict.get('imd_name'),
ddict['value']))
def finish(self):
@@ -101,18 +101,18 @@
SET res_id = imd.res_id
FROM ir_model_data AS imd
WHERE ti.res_id IS NULL
- AND ti.imd_module IS NOT NULL AND ti.imd_name IS NOT NULL
+ AND ti.module IS NOT NULL AND ti.imd_name IS NOT NULL
- AND ti.imd_module = imd.module AND ti.imd_name = imd.name
+ AND ti.module = imd.module AND ti.imd_name = imd.name
AND ti.imd_model = imd.model; """ % self._table_name)
if self._debug:
- cr.execute("SELECT imd_module, imd_model, imd_name FROM %s " \
- "WHERE res_id IS NULL AND imd_module IS NOT NULL" % self._table_name)
+ cr.execute("SELECT module, imd_model, imd_name FROM %s " \
+ "WHERE res_id IS NULL AND module IS NOT NULL" % self._table_name)
for row in cr.fetchall():
_logger.debug("ir.translation.cursor: missing res_id for %s. %s/%s ", *row)
- cr.execute("DELETE FROM %s WHERE res_id IS NULL AND imd_module IS NOT NULL" % \
+ cr.execute("DELETE FROM %s WHERE res_id IS NULL AND module IS NOT NULL" % \
self._table_name)
# Records w/o res_id must _not_ be inserted into our db, because they are
@@ -132,8 +132,8 @@
# Step 3: insert new translations
- cr.execute("""INSERT INTO %s(name, lang, res_id, src, type, value)
- SELECT name, lang, res_id, src, type, value
+ cr.execute("""INSERT INTO %s(name, lang, res_id, src, type, value, module)
+ SELECT name, lang, res_id, src, type, value, module
FROM %s AS ti
WHERE NOT EXISTS(SELECT 1 FROM ONLY %s AS irt WHERE %s);
""" % (self._parent_table, self._table_name, self._parent_table, find_expr))
@@ -167,6 +167,7 @@
'type': fields.selection(TRANSLATION_TYPE, string='Type', size=16, select=True),
'src': fields.text('Source'),
'value': fields.text('Translation Value'),
+ 'module': fields.char('Module Name', size=128),
}
_sql_constraints = [ ('lang_fkey_res_lang', 'FOREIGN KEY(lang) REFERENCES res_lang(code)',
@@ -322,6 +323,38 @@
""" Return a cursor-like object for fast inserting translations
"""
return ir_translation_import_cursor(cr, uid, self, context=context)
+
+ def load(self, cr, modules, langs, flag=None, context=None):
+ translated_data = {}
+ for module_name in modules:
+ translated_data[module_name] = {'messages':[]}
+ modpath = openerp.modules.get_module_path(module_name)
+ if not modpath:
+ # unable to find the module. we skip
+ continue
+ for lang in langs:
+ iso_lang = tools.get_iso_codes(lang)
+ f = openerp.modules.get_module_resource(module_name, 'i18n', iso_lang + '.po')
+ context2 = context and context.copy() or {}
+ if f and '_' in iso_lang:
+ iso_lang2 = iso_lang.split('_')[0]
+ f2 = openerp.modules.get_module_resource(module_name, 'i18n', iso_lang2 + '.po')
+ if f2:
+ _logger.info('module %s: loading base translation file %s for language %s', module_name, iso_lang2, lang)
+ translated_data[module_name]['messages'].extend(tools.trans_load(cr, f2, lang, verbose=False, flag=flag, module_name=module_name, context=context))
+ context2['overwrite'] = True
+ # Implementation notice: we must first search for the full name of
+ # the language derivative, like "en_UK", and then the generic,
+ # like "en".
+ if (not f) and '_' in iso_lang:
+ iso_lang = iso_lang.split('_')[0]
+ f = openerp.modules.get_module_resource(module_name, 'i18n', iso_lang + '.po')
+ if f:
+ _logger.info('module %s: loading translation file (%s) for language %s', module_name, iso_lang, lang)
+ translated_data[module_name]['messages'].extend(tools.trans_load(cr, f, lang, verbose=False, flag=flag, module_name=module_name, context=context2))
+ elif iso_lang != 'en':
+ _logger.warning('module %s: no translation for language %s', module_name, iso_lang)
+ return translated_data
ir_translation()
=== modified file 'openerp/addons/base/module/module.py'
--- openerp/addons/base/module/module.py 2012-06-19 15:16:26 +0000
+++ openerp/addons/base/module/module.py 2012-07-13 10:47:28 +0000
@@ -594,10 +594,10 @@
self.write(cr, uid, [mod_browse.id], {'category_id': p_id})
def update_translations(self, cr, uid, ids, filter_lang=None, context=None):
+ pool = pooler.get_pool(cr.dbname)
if context is None:
context = {}
if not filter_lang:
- pool = pooler.get_pool(cr.dbname)
lang_obj = pool.get('res.lang')
lang_ids = lang_obj.search(cr, uid, [('translatable', '=', True)])
filter_lang = [lang.code for lang in lang_obj.browse(cr, uid, lang_ids)]
@@ -607,32 +607,7 @@
for mod in self.browse(cr, uid, ids):
if mod.state != 'installed':
continue
- modpath = modules.get_module_path(mod.name)
- if not modpath:
- # unable to find the module. we skip
- continue
- for lang in filter_lang:
- iso_lang = tools.get_iso_codes(lang)
- f = modules.get_module_resource(mod.name, 'i18n', iso_lang + '.po')
- context2 = context and context.copy() or {}
- if f and '_' in iso_lang:
- iso_lang2 = iso_lang.split('_')[0]
- f2 = modules.get_module_resource(mod.name, 'i18n', iso_lang2 + '.po')
- if f2:
- _logger.info('module %s: loading base translation file %s for language %s', mod.name, iso_lang2, lang)
- tools.trans_load(cr, f2, lang, verbose=False, context=context)
- context2['overwrite'] = True
- # Implementation notice: we must first search for the full name of
- # the language derivative, like "en_UK", and then the generic,
- # like "en".
- if (not f) and '_' in iso_lang:
- iso_lang = iso_lang.split('_')[0]
- f = modules.get_module_resource(mod.name, 'i18n', iso_lang + '.po')
- if f:
- _logger.info('module %s: loading translation file (%s) for language %s', mod.name, iso_lang, lang)
- tools.trans_load(cr, f, lang, verbose=False, context=context2)
- elif iso_lang != 'en':
- _logger.warning('module %s: no translation for language %s', mod.name, iso_lang)
+ pool.get('ir.translation').load(cr, [mod.name], filter_lang, context=context)
def check(self, cr, uid, ids, context=None):
for mod in self.browse(cr, uid, ids, context=context):
=== modified file 'openerp/service/web_services.py'
--- openerp/service/web_services.py 2012-03-22 15:05:06 +0000
+++ openerp/service/web_services.py 2012-07-13 10:47:28 +0000
@@ -777,6 +777,28 @@
else:
raise Exception, 'ReportNotFound'
+class translation(netsvc.ExportService):
+
+ def __init__(self, name="translation"):
+ netsvc.ExportService.__init__(self, name)
+
+ def exp_load(self, db, modules, langs, flag=None, context=None):
+ cr = pooler.get_db(db).cursor()
+ translated_data = pooler.get_pool(db).get('ir.translation').load(cr, modules, langs, flag, context=context)
+ cr.commit()
+ cr.close()
+ return translated_data
+
+ def dispatch(self, method, params):
+ if method in ['load']:
+ # No security check for these methods
+ pass
+ else:
+ raise KeyError("Method not found: %s" % method)
+ fn = getattr(self, 'exp_'+method)
+ return fn(*params)
+
+translation()
def start_web_services():
db()
@@ -784,6 +806,7 @@
objects_proxy()
wizard()
report_spool()
+ translation()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
=== modified file 'openerp/tools/translate.py'
--- openerp/tools/translate.py 2012-06-28 14:16:32 +0000
+++ openerp/tools/translate.py 2012-07-13 10:47:28 +0000
@@ -43,6 +43,7 @@
from misc import UpdateableStr
from misc import SKIPPED_ELEMENT_TYPES
import osutil
+import babel.messages.pofile
_logger = logging.getLogger(__name__)
@@ -842,20 +843,27 @@
return out
-def trans_load(cr, filename, lang, verbose=True, context=None):
+def trans_load(cr, filename, lang, verbose=True, flag=None, module_name=None, context=None):
try:
fileobj = misc.file_open(filename)
+ traslation_obj = pooler.get_pool(cr.dbname).get('ir.translation')
_logger.info("loading %s", filename)
- fileformat = os.path.splitext(filename)[-1][1:].lower()
- r = trans_load_data(cr, fileobj, fileformat, lang, verbose=verbose, context=context)
+ transl = []
+ if flag == 'web':
+ cr.execute("select DISTINCT src,value from ir_translation where module='%s' AND lang='%s' AND value != ''"% (module_name,lang))
+ for src, value in cr.fetchall():
+ transl.append({'id': src, 'string': value})
+ else:
+ fileformat = os.path.splitext(filename)[-1][1:].lower()
+ trans_load_data(cr, fileobj, fileformat, lang, verbose=verbose, module_name=module_name, context=context)
fileobj.close()
- return r
+ return transl
except IOError:
if verbose:
_logger.error("couldn't read translation file %s", filename)
return None
-def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, context=None):
+def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, module_name=None, context=None):
"""Populates the ir_translation table."""
if verbose:
_logger.info('loading translation file for language %s', lang)
@@ -885,7 +893,7 @@
break
elif fileformat == 'po':
reader = TinyPoFile(fileobj)
- f = ['type', 'name', 'res_id', 'src', 'value']
+ f = ['type', 'name', 'res_id', 'src', 'value', 'module']
else:
_logger.error('Bad file format: %s', fileformat)
raise Exception(_('Bad file format'))
@@ -902,7 +910,7 @@
# dictionary which holds values for this line of the csv file
# {'lang': ..., 'type': ..., 'name': ..., 'res_id': ...,
- # 'src': ..., 'value': ...}
+ # 'src': ..., 'value': ..., 'module':...}
dic = {'lang': lang}
dic_module = False
for i in range(len(f)):
@@ -918,6 +926,7 @@
if res_id and isinstance(res_id, (int, long)) \
or (isinstance(res_id, basestring) and res_id.isdigit()):
dic['res_id'] = int(res_id)
+ dic['module'] = module_name
else:
try:
tmodel = dic['name'].split(',')[0]
@@ -927,9 +936,8 @@
tmodule = dic_module
tname = res_id
dic['imd_model'] = tmodel
- dic['imd_module'] = tmodule
+ dic['module'] = tmodule
dic['imd_name'] = tname
-
dic['res_id'] = None
except Exception:
_logger.warning("Could not decode resource for %s, please fix the po file.",
_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help : https://help.launchpad.net/ListHelp