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

Reply via email to