[MERGE] translations: refactoring/deferral of translated resource id resolution, fixing several translation issues
lp bug: https://launchpad.net/bugs/696760 fixed bzr revid: odo@openerp.com-20110107151735-agubxu82g0ursdbh
This commit is contained in:
commit
8edba174ce
|
@ -61,6 +61,10 @@ class ir_translation(osv.osv):
|
||||||
'type': fields.selection(TRANSLATION_TYPE, string='Type', size=16, select=True),
|
'type': fields.selection(TRANSLATION_TYPE, string='Type', size=16, select=True),
|
||||||
'src': fields.text('Source'),
|
'src': fields.text('Source'),
|
||||||
'value': fields.text('Translation Value'),
|
'value': fields.text('Translation Value'),
|
||||||
|
# These two columns map to ir_model_data.module and ir_model_data.name.
|
||||||
|
# They are used to resolve the res_id above after loading is done.
|
||||||
|
'module': fields.char('Module', size=64, help='Maps to the ir_model_data for which this translation is provided.'),
|
||||||
|
'xml_id': fields.char('XML Id', size=128, help='Maps to the ir_model_data for which this translation is provided.'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _auto_init(self, cr, context={}):
|
def _auto_init(self, cr, context={}):
|
||||||
|
@ -88,8 +92,6 @@ class ir_translation(osv.osv):
|
||||||
cr.execute('CREATE INDEX ir_translation_ltn ON ir_translation (name, lang, type)')
|
cr.execute('CREATE INDEX ir_translation_ltn ON ir_translation (name, lang, type)')
|
||||||
cr.commit()
|
cr.commit()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@tools.cache(skiparg=3, multi='ids')
|
@tools.cache(skiparg=3, multi='ids')
|
||||||
def _get_ids(self, cr, uid, name, tt, lang, ids):
|
def _get_ids(self, cr, uid, name, tt, lang, ids):
|
||||||
translations = dict.fromkeys(ids, False)
|
translations = dict.fromkeys(ids, False)
|
||||||
|
|
|
@ -501,7 +501,7 @@ class module(osv.osv):
|
||||||
f2 = addons.get_module_resource(mod.name, 'i18n', iso_lang2 + '.po')
|
f2 = addons.get_module_resource(mod.name, 'i18n', iso_lang2 + '.po')
|
||||||
if f2:
|
if f2:
|
||||||
logger.info('module %s: loading base translation file %s for language %s', mod.name, iso_lang2, lang)
|
logger.info('module %s: loading base translation file %s for language %s', mod.name, iso_lang2, lang)
|
||||||
tools.trans_load(cr.dbname, f2, lang, verbose=False, context=context)
|
tools.trans_load(cr, f2, lang, verbose=False, context=context)
|
||||||
context2['overwrite'] = True
|
context2['overwrite'] = True
|
||||||
# Implementation notice: we must first search for the full name of
|
# Implementation notice: we must first search for the full name of
|
||||||
# the language derivative, like "en_UK", and then the generic,
|
# the language derivative, like "en_UK", and then the generic,
|
||||||
|
@ -511,9 +511,10 @@ class module(osv.osv):
|
||||||
f = addons.get_module_resource(mod.name, 'i18n', iso_lang + '.po')
|
f = addons.get_module_resource(mod.name, 'i18n', iso_lang + '.po')
|
||||||
if f:
|
if f:
|
||||||
logger.info('module %s: loading translation file (%s) for language %s', mod.name, iso_lang, lang)
|
logger.info('module %s: loading translation file (%s) for language %s', mod.name, iso_lang, lang)
|
||||||
tools.trans_load(cr.dbname, f, lang, verbose=False, context=context2)
|
tools.trans_load(cr, f, lang, verbose=False, context=context2)
|
||||||
elif iso_lang != 'en':
|
elif iso_lang != 'en':
|
||||||
logger.warning('module %s: no translation for language %s', mod.name, iso_lang)
|
logger.warning('module %s: no translation for language %s', mod.name, iso_lang)
|
||||||
|
tools.trans_update_res_ids(cr)
|
||||||
|
|
||||||
def check(self, cr, uid, ids, context=None):
|
def check(self, cr, uid, ids, context=None):
|
||||||
logger = logging.getLogger('init')
|
logger = logging.getLogger('init')
|
||||||
|
|
|
@ -56,7 +56,8 @@ class base_language_import(osv.osv_memory):
|
||||||
fileformat = first_line.endswith("type,name,res_id,src,value") and 'csv' or 'po'
|
fileformat = first_line.endswith("type,name,res_id,src,value") and 'csv' or 'po'
|
||||||
fileobj.seek(0)
|
fileobj.seek(0)
|
||||||
|
|
||||||
tools.trans_load_data(cr.dbname, fileobj, fileformat, import_data.code, lang_name=import_data.name)
|
tools.trans_load_data(cr, fileobj, fileformat, import_data.code, lang_name=import_data.name)
|
||||||
|
tools.trans_update_res_ids(cr)
|
||||||
fileobj.close()
|
fileobj.close()
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
|
@ -45,8 +45,9 @@ class base_update_translations(osv.osv_memory):
|
||||||
this = self.browse(cr, uid, ids)[0]
|
this = self.browse(cr, uid, ids)[0]
|
||||||
lang_name = self._get_lang_name(cr, uid, this.lang)
|
lang_name = self._get_lang_name(cr, uid, this.lang)
|
||||||
buf=cStringIO.StringIO()
|
buf=cStringIO.StringIO()
|
||||||
tools.trans_export(this.lang, ['all'], buf, 'csv', dbname=cr.dbname)
|
tools.trans_export(this.lang, ['all'], buf, 'csv', cr)
|
||||||
tools.trans_load_data(cr.dbname, buf, 'csv', this.lang, lang_name=lang_name)
|
tools.trans_load_data(cr, buf, 'csv', this.lang, lang_name=lang_name)
|
||||||
|
tools.trans_update_res_ids(cr)
|
||||||
buf.close()
|
buf.close()
|
||||||
return {'type': 'ir.actions.act_window_close'}
|
return {'type': 'ir.actions.act_window_close'}
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,10 @@ if tools.config["translate_out"]:
|
||||||
|
|
||||||
fileformat = os.path.splitext(tools.config["translate_out"])[-1][1:].lower()
|
fileformat = os.path.splitext(tools.config["translate_out"])[-1][1:].lower()
|
||||||
buf = file(tools.config["translate_out"], "w")
|
buf = file(tools.config["translate_out"], "w")
|
||||||
tools.trans_export(tools.config["language"], tools.config["translate_modules"], buf, fileformat)
|
dbname = tools.config['db_name']
|
||||||
|
cr = pooler.get_db(dbname).cursor()
|
||||||
|
tools.trans_export(tools.config["language"], tools.config["translate_modules"] or ["all"], buf, fileformat, cr)
|
||||||
|
cr.close()
|
||||||
buf.close()
|
buf.close()
|
||||||
|
|
||||||
logger.info('translation file written successfully')
|
logger.info('translation file written successfully')
|
||||||
|
@ -152,10 +155,15 @@ if tools.config["translate_out"]:
|
||||||
|
|
||||||
if tools.config["translate_in"]:
|
if tools.config["translate_in"]:
|
||||||
context = {'overwrite': tools.config["overwrite_existing_translations"]}
|
context = {'overwrite': tools.config["overwrite_existing_translations"]}
|
||||||
tools.trans_load(tools.config["db_name"],
|
dbname = tools.config['db_name']
|
||||||
|
cr = pooler.get_db(dbname).cursor()
|
||||||
|
tools.trans_load(cr,
|
||||||
tools.config["translate_in"],
|
tools.config["translate_in"],
|
||||||
tools.config["language"],
|
tools.config["language"],
|
||||||
context=context)
|
context=context)
|
||||||
|
tools.trans_update_res_ids(cr)
|
||||||
|
cr.commit()
|
||||||
|
cr.close()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
#----------------------------------------------------------------------------------
|
#----------------------------------------------------------------------------------
|
||||||
|
|
|
@ -409,7 +409,7 @@ class TinyPoFile(object):
|
||||||
|
|
||||||
# Methods to export the translation file
|
# Methods to export the translation file
|
||||||
|
|
||||||
def trans_export(lang, modules, buffer, format, dbname=None):
|
def trans_export(lang, modules, buffer, format, cr):
|
||||||
|
|
||||||
def _process(format, modules, rows, buffer, lang, newlang):
|
def _process(format, modules, rows, buffer, lang, newlang):
|
||||||
if format == 'csv':
|
if format == 'csv':
|
||||||
|
@ -461,7 +461,7 @@ def trans_export(lang, modules, buffer, format, dbname=None):
|
||||||
newlang = not bool(lang)
|
newlang = not bool(lang)
|
||||||
if newlang:
|
if newlang:
|
||||||
lang = 'en_US'
|
lang = 'en_US'
|
||||||
trans = trans_generate(lang, modules, dbname)
|
trans = trans_generate(lang, modules, cr)
|
||||||
if newlang and format!='csv':
|
if newlang and format!='csv':
|
||||||
for trx in trans:
|
for trx in trans:
|
||||||
trx[-1] = ''
|
trx[-1] = ''
|
||||||
|
@ -524,17 +524,13 @@ def in_modules(object_name, modules):
|
||||||
module = module_dict.get(module, module)
|
module = module_dict.get(module, module)
|
||||||
return module in modules
|
return module in modules
|
||||||
|
|
||||||
def trans_generate(lang, modules, dbname=None):
|
def trans_generate(lang, modules, cr):
|
||||||
logger = logging.getLogger('i18n')
|
logger = logging.getLogger('i18n')
|
||||||
if not dbname:
|
dbname = cr.dbname
|
||||||
dbname=tools.config['db_name']
|
|
||||||
if not modules:
|
|
||||||
modules = ['all']
|
|
||||||
|
|
||||||
pool = pooler.get_pool(dbname)
|
pool = pooler.get_pool(dbname)
|
||||||
trans_obj = pool.get('ir.translation')
|
trans_obj = pool.get('ir.translation')
|
||||||
model_data_obj = pool.get('ir.model.data')
|
model_data_obj = pool.get('ir.model.data')
|
||||||
cr = pooler.get_db(dbname).cursor()
|
|
||||||
uid = 1
|
uid = 1
|
||||||
l = pool.obj_pool.items()
|
l = pool.obj_pool.items()
|
||||||
l.sort()
|
l.sort()
|
||||||
|
@ -834,16 +830,15 @@ def trans_generate(lang, modules, dbname=None):
|
||||||
trans = trans_obj._get_source(cr, uid, name, type, lang, source)
|
trans = trans_obj._get_source(cr, uid, name, type, lang, source)
|
||||||
out.append([module, type, name, id, source, encode(trans) or ''])
|
out.append([module, type, name, id, source, encode(trans) or ''])
|
||||||
|
|
||||||
cr.close()
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def trans_load(db_name, filename, lang, verbose=True, context=None):
|
def trans_load(cr, filename, lang, verbose=True, context=None):
|
||||||
logger = logging.getLogger('i18n')
|
logger = logging.getLogger('i18n')
|
||||||
try:
|
try:
|
||||||
fileobj = open(filename,'r')
|
fileobj = open(filename,'r')
|
||||||
logger.info("loading %s", filename)
|
logger.info("loading %s", filename)
|
||||||
fileformat = os.path.splitext(filename)[-1][1:].lower()
|
fileformat = os.path.splitext(filename)[-1][1:].lower()
|
||||||
r = trans_load_data(db_name, fileobj, fileformat, lang, verbose=verbose, context=context)
|
r = trans_load_data(cr, fileobj, fileformat, lang, verbose=verbose, context=context)
|
||||||
fileobj.close()
|
fileobj.close()
|
||||||
return r
|
return r
|
||||||
except IOError:
|
except IOError:
|
||||||
|
@ -851,12 +846,16 @@ def trans_load(db_name, filename, lang, verbose=True, context=None):
|
||||||
logger.error("couldn't read translation file %s", filename)
|
logger.error("couldn't read translation file %s", filename)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def trans_load_data(db_name, fileobj, fileformat, lang, lang_name=None, verbose=True, context=None):
|
def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, context=None):
|
||||||
|
"""Populates the ir_translation table. Fixing the res_ids so that they point
|
||||||
|
correctly to ir_model_data is done in a separate step, using the
|
||||||
|
'trans_update_res_ids' function below."""
|
||||||
logger = logging.getLogger('i18n')
|
logger = logging.getLogger('i18n')
|
||||||
if verbose:
|
if verbose:
|
||||||
logger.info('loading translation file for language %s', lang)
|
logger.info('loading translation file for language %s', lang)
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
|
db_name = cr.dbname
|
||||||
pool = pooler.get_pool(db_name)
|
pool = pooler.get_pool(db_name)
|
||||||
lang_obj = pool.get('res.lang')
|
lang_obj = pool.get('res.lang')
|
||||||
trans_obj = pool.get('ir.translation')
|
trans_obj = pool.get('ir.translation')
|
||||||
|
@ -864,7 +863,6 @@ def trans_load_data(db_name, fileobj, fileformat, lang, lang_name=None, verbose=
|
||||||
iso_lang = tools.get_iso_codes(lang)
|
iso_lang = tools.get_iso_codes(lang)
|
||||||
try:
|
try:
|
||||||
uid = 1
|
uid = 1
|
||||||
cr = pooler.get_db(db_name).cursor()
|
|
||||||
ids = lang_obj.search(cr, uid, [('code','=', lang)])
|
ids = lang_obj.search(cr, uid, [('code','=', lang)])
|
||||||
|
|
||||||
if not ids:
|
if not ids:
|
||||||
|
@ -906,16 +904,12 @@ def trans_load_data(db_name, fileobj, fileformat, lang, lang_name=None, verbose=
|
||||||
|
|
||||||
try:
|
try:
|
||||||
dic['res_id'] = dic['res_id'] and int(dic['res_id']) or 0
|
dic['res_id'] = dic['res_id'] and int(dic['res_id']) or 0
|
||||||
|
dic['module'] = False
|
||||||
|
dic['xml_id'] = False
|
||||||
except:
|
except:
|
||||||
model_data_ids = model_data_obj.search(cr, uid, [
|
split_id = dic['res_id'].split('.', 1)
|
||||||
('model', '=', dic['name'].split(',')[0]),
|
dic['module'] = split_id[0]
|
||||||
('module', '=', dic['res_id'].split('.', 1)[0]),
|
dic['xml_id'] = split_id[1]
|
||||||
('name', '=', dic['res_id'].split('.', 1)[1]),
|
|
||||||
])
|
|
||||||
if model_data_ids:
|
|
||||||
dic['res_id'] = model_data_obj.browse(cr, uid,
|
|
||||||
model_data_ids[0]).res_id
|
|
||||||
else:
|
|
||||||
dic['res_id'] = False
|
dic['res_id'] = False
|
||||||
|
|
||||||
args = [
|
args = [
|
||||||
|
@ -932,14 +926,24 @@ def trans_load_data(db_name, fileobj, fileformat, lang, lang_name=None, verbose=
|
||||||
trans_obj.write(cr, uid, ids, {'value': dic['value']})
|
trans_obj.write(cr, uid, ids, {'value': dic['value']})
|
||||||
else:
|
else:
|
||||||
trans_obj.create(cr, uid, dic)
|
trans_obj.create(cr, uid, dic)
|
||||||
cr.commit()
|
|
||||||
cr.close()
|
|
||||||
if verbose:
|
if verbose:
|
||||||
logger.info("translation file loaded succesfully")
|
logger.info("translation file loaded succesfully")
|
||||||
except IOError:
|
except IOError:
|
||||||
filename = '[lang: %s][format: %s]' % (iso_lang or 'new', fileformat)
|
filename = '[lang: %s][format: %s]' % (iso_lang or 'new', fileformat)
|
||||||
logger.exception("couldn't read translation file %s", filename)
|
logger.exception("couldn't read translation file %s", filename)
|
||||||
|
|
||||||
|
def trans_update_res_ids(cr):
|
||||||
|
cr.execute("""
|
||||||
|
UPDATE ir_translation
|
||||||
|
SET res_id = (SELECT ir_model_data.res_id
|
||||||
|
FROM ir_model_data
|
||||||
|
WHERE ir_translation.module = ir_model_data.module
|
||||||
|
AND ir_translation.xml_id = ir_model_data.name)
|
||||||
|
WHERE ir_translation.module is not null
|
||||||
|
AND ir_translation.xml_id is not null
|
||||||
|
AND ir_translation.res_id = 0;
|
||||||
|
""")
|
||||||
|
|
||||||
def get_locales(lang=None):
|
def get_locales(lang=None):
|
||||||
if lang is None:
|
if lang is None:
|
||||||
lang = locale.getdefaultlocale()[0]
|
lang = locale.getdefaultlocale()[0]
|
||||||
|
|
Loading…
Reference in New Issue