[FIX] avoid a crash when resetting the local with python 2.4 (lp:322432)

[IMP] do not rewrite locale information every time
[IMP] all message about translations are logger into the 'i18n' logger
[FIX] the code and the name of the languages must be unique

lp bug: https://launchpad.net/bugs/322432 fixed

bzr revid: christophe@taupe-20090129232017-7lvamen2b3s1waxp
This commit is contained in:
Christophe Simonis 2009-01-30 00:20:17 +01:00
parent 60ea76e4c5
commit 5fb02b1607
3 changed files with 50 additions and 52 deletions

View File

@ -469,7 +469,7 @@ class module(osv.osv):
for lang in filter_lang:
f = os.path.join(modpath, 'i18n', lang + '.po')
if os.path.exists(f):
logger.notifyChannel("init", netsvc.LOG_INFO, 'module %s: loading translation file for language %s' % (mod.name, lang))
logger.notifyChannel("i18n", netsvc.LOG_INFO, 'module %s: loading translation file for language %s' % (mod.name, lang))
tools.trans_load(cr.dbname, f, lang, verbose=False)

View File

@ -55,6 +55,10 @@ class lang(osv.osv):
'decimal_point':lambda *a: '.',
'thousands_sep':lambda *a: ',',
}
_sql_constraints = [
('name_uniq', 'unique (name)', 'The name of the language must be unique !'),
('code_uniq', 'unique (code)', 'The code of the language must be unique !'),
]
def _group(self,cr,uid,ids,s, monetary=False):
conv = localeconv()

View File

@ -447,7 +447,7 @@ def trans_generate(lang, modules, dbname=None):
push_translation(module, report_type, name, 0, t)
except IOError, xml.dom.expatbuilder.expat.ExpatError:
if fname:
logger.notifyChannel("init", netsvc.LOG_ERROR, "couldn't export translation for report %s %s %s" % (name, report_type, fname))
logger.notifyChannel("i18n", netsvc.LOG_ERROR, "couldn't export translation for report %s %s %s" % (name, report_type, fname))
for constraint in pool.get(model)._constraints:
msg = constraint[1]
@ -506,14 +506,13 @@ def trans_load(db_name, filename, lang, strict=False, verbose=True):
return r
except IOError:
if verbose:
logger.notifyChannel("init", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,))
logger.notifyChannel("i18n", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,))
return None
def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=None, verbose=True):
logger = netsvc.Logger()
if verbose:
logger.notifyChannel("init", netsvc.LOG_INFO,
'loading translation file for language %s' % (lang))
logger.notifyChannel("i18n", netsvc.LOG_INFO, 'loading translation file for language %s' % (lang))
pool = pooler.get_pool(db_name)
lang_obj = pool.get('res.lang')
trans_obj = pool.get('ir.translation')
@ -521,62 +520,57 @@ def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=
try:
uid = 1
cr = pooler.get_db(db_name).cursor()
ids = lang_obj.search(cr, uid, [('code','=',lang)])
lc, encoding = locale.getdefaultlocale()
if not encoding:
encoding = 'UTF-8'
if encoding == 'utf':
encoding = 'UTF-8'
if encoding == 'cp1252':
encoding= '1252'
if encoding == 'iso-8859-1':
encoding= 'iso-8859-15'
if encoding == 'latin1':
encoding= 'latin9'
try:
if os.name == 'nt':
locale.setlocale(locale.LC_ALL, str(_LOCALE2WIN32.get(lang, lang) + '.' + encoding))
else:
locale.setlocale(locale.LC_ALL, str(lang + '.' + encoding))
except Exception:
netsvc.Logger().notifyChannel(' ', netsvc.LOG_WARNING,
'unable to set locale "%s"' % (lang))
ids = lang_obj.search(cr, uid, [('code','=', lang)])
if not ids:
# lets create the language with locale information
lc, encoding = locale.getdefaultlocale()
if not encoding:
encoding = 'UTF-8'
if encoding == 'utf':
encoding = 'UTF-8'
if encoding == 'cp1252':
encoding= '1252'
if encoding == 'iso-8859-1':
encoding= 'iso-8859-15'
if encoding == 'latin1':
encoding= 'latin9'
try:
if os.name == 'nt':
from report.report_sxw import _LOCALE2WIN32
code = _LOCALE2WIN32.get(lang, lang)
else:
code = lang
locale.setlocale(locale.LC_ALL, locale.normalize(str(lang + '.' + encoding)))
except Exception:
msg = 'Unable to get information for locale %s. Information from the default locale (%s) have been used.'
logger.notifyChannel('i18n', netsvc.LOG_WARNING, msg % (lang, lc))
if not lang_name:
lang_name=lang
languages=tools.get_languages()
lang_name = languages.get(lang, lang)
ids = lang_obj.create(cr, uid, {
lang_name = tools.get_languages().get(lang, lang)
lang_info = {
'code': lang,
'name': lang_name,
'translatable': 1,
'date_format' : str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y')),
'time_format' : str(locale.nl_langinfo(locale.T_FMT)),
'grouping' : [],
'decimal_point' : str(locale.nl_langinfo(locale.RADIXCHAR)),
'thousands_sep' : str(locale.nl_langinfo(locale.THOUSEP))
})
else:
lang_obj.write(cr, uid, ids, {'translatable':1,
'date_format' : str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y')),
'time_format' : str(locale.nl_langinfo(locale.T_FMT)),
'grouping' : [],
'decimal_point' : str(locale.nl_langinfo(locale.RADIXCHAR)),
'thousands_sep' : str(locale.nl_langinfo(locale.THOUSEP))
})
try:
locale.resetlocale(locale.LC_ALL)
except:
pass
lang_ids = lang_obj.search(cr, uid, [])
langs = lang_obj.read(cr, uid, lang_ids)
ls = map(lambda x: (x['code'],x['name']), langs)
}
try:
lang_obj.create(cr, uid, lang_info)
finally:
# locale.resetlocale is bugged with some locales.
# we need to normalize the result of locale.getdefaultlocale()
locale.setlocale(locale.LC_ALL, locale.normalize(locale._build_localename(locale.getdefaultlocale())))
# now, the serious things: we read the language file
fileobj.seek(0)
if fileformat == 'csv':
reader = csv.reader(fileobj, quotechar='"', delimiter=',')
# read the first line of the file (it contains columns titles)
@ -659,11 +653,11 @@ def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=
cr.commit()
cr.close()
if verbose:
logger.notifyChannel("init", netsvc.LOG_INFO,
logger.notifyChannel("i18n", netsvc.LOG_INFO,
"translation file loaded succesfully")
except IOError:
filename = '[lang: %s][format: %s]' % (lang or 'new', fileformat)
logger.notifyChannel("init", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,))
logger.notifyChannel("i18n", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,))
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: