diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index 27d9d9f116b..984a2c65fe9 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -15,6 +15,7 @@ The kernel of Odoo, needed for all installation. 'website': 'http://www.openerp.com', 'depends': [], 'data': [ + 'res/res.lang.csv', 'base_data.xml', 'res/res_currency_data.xml', 'res/res_country_data.xml', diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index cb482b174e8..51904e27201 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -12,15 +12,6 @@ child_id - - en_US - English - True - [3,0] - . - , - - diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index 14924a50665..9ae9552f26c 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -4,7 +4,7 @@ from difflib import get_close_matches import logging -from openerp import api, tools +from openerp import api, tools, SUPERUSER_ID import openerp.modules from openerp.osv import fields, osv from openerp.tools.translate import _ @@ -631,6 +631,11 @@ class ir_translation(osv.osv): def load_module_terms(self, cr, modules, langs, context=None): context = dict(context or {}) # local copy + # make sure the given languages are active + lang_obj = self.pool['res.lang'] + for lang in langs: + lang_obj.load_lang(cr, SUPERUSER_ID, lang) + # load i18n files for module_name in modules: modpath = openerp.modules.get_module_path(module_name) if not modpath: diff --git a/openerp/addons/base/res/res.lang.csv b/openerp/addons/base/res/res.lang.csv new file mode 100644 index 00000000000..1c93ba4ef77 --- /dev/null +++ b/openerp/addons/base/res/res.lang.csv @@ -0,0 +1,76 @@ +"id","name","code","iso_code","direction","grouping","decimal_point","thousands_sep","date_format","time_format","translatable" +"base.lang_en","English","en_US","en","Left-to-Right","[3,0]",".",",","%m/%d/%Y","%H:%M:%S","True" +"base.lang_am_ET","Amharic / አምሃርኛ","am_ET","am_ET","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%I:%M:%S","True" +"base.lang_ar_SY","Arabic / الْعَرَبيّة","ar_SY","ar_SY","Left-to-Right","[3,0]",".",",","%d %b, %Y","%I:%M:%S","True" +"base.lang_eu_ES","Basque / Euskara","eu_ES","eu_ES","Left-to-Right","[]",",",,"%a, %Y.eko %bren %da","%H:%M:%S","True" +"base.lang_bs_BA","Bosnian / bosanski jezik","bs_BA","bs_BA","Left-to-Right","[]",",",,"%d.%m.%Y","%H:%M:%S","True" +"base.lang_bg","Bulgarian / български език","bg_BG","bg","Left-to-Right","[3,0]",",",,"%d.%m.%Y","%H,%M,%S","True" +"base.lang_ca_ES","Catalan / Català","ca_ES","ca_ES","Left-to-Right","[]",",",,"%d/%m/%Y","%H:%M:%S","True" +"base.lang_zh_CN","Chinese (CN) / 简体中文","zh_CN","zh_CN","Left-to-Right","[3,0]",".",",","%Y年%m月%d日","%H时%M分%S秒","True" +"base.lang_zh_HK","Chinese (HK)","zh_HK","zh_HK","Left-to-Right","[3,0]",".",",","%Y年%m月%d日 %A","%I時%M分%S秒","True" +"base.lang_zh_TW","Chinese (TW) / 正體字","zh_TW","zh_TW","Left-to-Right","[3,0]",".",",","%Y年%m月%d日","%H時%M分%S秒","True" +"base.lang_hr","Croatian / hrvatski jezik","hr_HR","hr","Left-to-Right","[]",",",,"%d.%m.%Y","%H:%M:%S","True" +"base.lang_cs_CZ","Czech / Čeština","cs_CZ","cs_CZ","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","True" +"base.lang_da_DK","Danish / Dansk","da_DK","da_DK","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","True" +"base.lang_nl_BE","Dutch (BE) / Nederlands (BE)","nl_BE","nl_BE","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","True" +"base.lang_nl","Dutch / Nederlands","nl_NL","nl","Left-to-Right","[]",",",,"%d-%m-%Y","%H:%M:%S","True" +"base.lang_en_AU","English (AU)","en_AU","en_AU","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True" +"base.lang_en_GB","English (UK)","en_GB","en_GB","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True" +"base.lang_et_EE","Estonian / Eesti keel","et_EE","et_EE","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","True" +"base.lang_fi","Finnish / Suomi","fi_FI","fi","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H.%M.%S","True" +"base.lang_fr_BE","French (BE) / Français (BE)","fr_BE","fr_BE","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_fr_CA","French (CA) / Français (CA)","fr_CA","fr_CA","Left-to-Right","[3,0]",","," ","%Y-%m-%d","%H:%M:%S","True" +"base.lang_fr_CH","French (CH) / Français (CH)","fr_CH","fr_CH","Left-to-Right","[3,0]",".","'","%d. %m. %Y","%H:%M:%S","True" +"base.lang_fr","French / Français","fr_FR","fr","Left-to-Right","[3,0]",","," ","%d/%m/%Y","%H:%M:%S","True" +"base.lang_gl_ES","Galician / Galego","gl_ES","gl_ES","Left-to-Right","[]",",",,"%d/%m/%Y","%H:%M:%S","True" +"base.lang_ka_GE","Georgian / ქართული ენა","ka_GE","ka_GE","Left-to-Right","[3,0]",",",".","%m/%d/%Y","%H:%M:%S","True" +"base.lang_de","German / Deutsch","de_DE","de","Left-to-Right","[3,0]",",",".","%d.%m.%Y","%H:%M:%S","True" +"base.lang_el_GR","Greek / Ελληνικά","el_GR","el_GR","Left-to-Right","[]",",",".","%d/%m/%Y","%I:%M:%S %p","True" +"base.lang_gu_IN","Gujarati / ગુજરાતી","gu_IN","gu_IN","Left-to-Right","[]",".",",","%A %d %b %Y","%I:%M:%S","True" +"base.lang_he_IL","Hebrew / עִבְרִי","he_IL","he_IL","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True" +"base.lang_hi_IN","Hindi / हिंदी","hi_IN","hi_IN","Left-to-Right","[]",".",",","%A %d %b %Y","%I:%M:%S","True" +"base.lang_hu","Hungarian / Magyar","hu_HU","hu","Left-to-Right","[3,0]",",",".","%Y-%m-%d","%H.%M.%S","True" +"base.lang_id","Indonesian / Bahasa Indonesia","id_ID","id","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_it","Italian / Italiano","it_IT","it","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_ja_JP","Japanese / 日本語","ja_JP","ja_JP","Left-to-Right","[3,0]",".",",","%Y年%m月%d日","%H時%M分%S秒","True" +"base.lang_kab_DZ","Kabyle / Taqbaylit","kab_DZ","kab_DZ","Left-to-Right","[]",".",",","%m/%d/%Y","%I:%M:%S %p","True" +"base.lang_ko_KP","Korean (KP) / 한국어 (KP)","ko_KP","ko_KP","Left-to-Right","[3,0]",".",",","%m/%d/%Y","%I:%M:%S %p","True" +"base.lang_ko_KR","Korean (KR) / 한국어 (KR)","ko_KR","ko_KR","Left-to-Right","[3,0]",".",",","%Y년 %m월 %d일","%H시 %M분 %S초","True" +"base.lang_lo_LA","Lao / ພາສາລາວ","lo_LA","lo_LA","Left-to-Right","[3,0]",".",",","%d/%m/y","%H:%M:%S","True" +"base.lang_lv","Latvian / latviešu valoda","lv_LV","lv","Left-to-Right","[3,0]",","," ","%Y.%m.%d.","%H:%M:%S","True" +"base.lang_lt","Lithuanian / Lietuvių kalba","lt_LT","lt","Left-to-Right","[3,0]",",",".","%Y.%m.%d","%H:%M:%S","True" +"base.lang_mk","Macedonian / македонски јазик","mk_MK","mk","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","True" +"base.lang_mn","Mongolian / монгол","mn_MN","mn","Left-to-Right","[3,0]",",",".","%Y.%m.%d","%H:%M:%S","True" +"base.lang_nb_NO","Norwegian Bokmål / Norsk bokmål","nb_NO","nb_NO","Left-to-Right","[3,0]",","," ","%d. %b %Y","%H:%M:%S","True" +"base.lang_fa_IR","Persian / فارس","fa_IR","fa_IR","Left-to-Right","[3,0]",".",",","%Y/%m/%d","%H:%M:%S","True" +"base.lang_pl","Polish / Język polski","pl_PL","pl","Left-to-Right","[]",",",,"%d.%m.%Y","%H:%M:%S","True" +"base.lang_pt_BR","Portuguese (BR) / Português (BR)","pt_BR","pt_BR","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_pt","Portuguese / Português","pt_PT","pt","Left-to-Right","[]",",",,"%d-%m-%Y","%H:%M:%S","True" +"base.lang_ro","Romanian / română","ro_RO","ro","Left-to-Right","[3,0]",",",".","%d.%m.%Y","%H:%M:%S","True" +"base.lang_ru","Russian / русский язык","ru_RU","ru","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","True" +"base.lang_sr_RS","Serbian (Cyrillic) / српски","sr_RS","sr_RS","Left-to-Right","[]",",",,"%d.%m.%Y.","%H:%M:%S","True" +"base.lang_sr@latin","Serbian (Latin) / srpski","sr@latin","sr@latin","Left-to-Right","[]",".",",","%m/%d/%Y","%I:%M:%S %p","True" +"base.lang_sk","Slovak / Slovenský jazyk","sk_SK","sk","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","True" +"base.lang_sl_SI","Slovenian / slovenščina","sl_SI","sl_SI","Left-to-Right","[]",","," ","%d. %m. %Y","%H:%M:%S","True" +"base.lang_es_AR","Spanish (AR) / Español (AR)","es_AR","es_AR","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_BO","Spanish (BO) / Español (BO)","es_BO","es_BO","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_CL","Spanish (CL) / Español (CL)","es_CL","es_CL","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_CO","Spanish (CO) / Español (CO)","es_CO","es_CO","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_CR","Spanish (CR) / Español (CR)","es_CR","es_CR","Left-to-Right","[3,0]",","," ","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_DO","Spanish (DO) / Español (DO)","es_DO","es_DO","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_EC","Spanish (EC) / Español (EC)","es_EC","es_EC","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_GT","Spanish (GT) / Español (GT)","es_GT","es_GT","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_MX","Spanish (MX) / Español (MX)","es_MX","es_MX","Left-to-Right","[3,0]","."," ","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_PA","Spanish (PA) / Español (PA)","es_PA","es_PA","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_PE","Spanish (PE) / Español (PE)","es_PE","es_PE","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_PY","Spanish (PY) / Español (PY)","es_PY","es_PY","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_UY","Spanish (UY) / Español (UY)","es_UY","es_UY","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es_VE","Spanish (VE) / Español (VE)","es_VE","es_VE","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_es","Spanish / Español","es_ES","es","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_sv_SE","Swedish / svenska","sv_SE","sv_SE","Left-to-Right","[3,0]",","," ","%Y-%m-%d","%H:%M:%S","True" +"base.lang_th","Thai / ภาษาไทย","th_TH","th","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True" +"base.lang_tr","Turkish / Türkçe","tr_TR","tr","Left-to-Right","[3,0]",",",".","%d-%m-%Y","%H:%M:%S","True" +"base.lang_uk_UA","Ukrainian / українська","uk_UA","uk_UA","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","True" +"base.lang_vi_VN","Vietnamese / Tiếng Việt","vi_VN","vi_VN","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True" +"base.lang_sq_AL","Albanian / Shqip","sq_AL","sq_AL","Left-to-Right","[3,0]",",",".","%Y-%b-%d","%I.%M.%S.","True" +"base.lang_te_IN","Telugu / తెలుగు","te_IN","te_IN","Left-to-Right","[]",".",",","%B %d %A %Y","%p%I.%M.%S","True" diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index d783c98f445..eb797f720f4 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -44,6 +44,13 @@ class lang(osv.osv): return True def load_lang(self, cr, uid, lang, lang_name=None): + """ Create the given language if necessary, and make it active. """ + # if the language exists, simply make it active + lang_ids = self.search(cr, uid, [('code', '=', lang)], context={'active_test': False}) + if lang_ids: + self.write(cr, uid, lang_ids, {'active': True}) + return lang_ids[0] + # create the language with locale information fail = True iso_lang = tools.get_iso_codes(lang) @@ -62,7 +69,6 @@ class lang(osv.osv): if not lang_name: lang_name = tools.ALL_LANGUAGES.get(lang, lang) - def fix_xa0(s): """Fix badly-encoded non-breaking space Unicode character from locale.localeconv(), coercing to utf-8, as some platform seem to output localeconv() in their system @@ -80,7 +86,6 @@ class lang(osv.osv): # For some locales, nl_langinfo returns a D_FMT/T_FMT that contains # unsupported '%-' patterns, e.g. for cs_CZ format = format.replace('%-', '%') - for pattern, replacement in tools.DATETIME_FORMATS_MAP.iteritems(): format = format.replace(pattern, replacement) return str(format) @@ -89,7 +94,8 @@ class lang(osv.osv): 'code': lang, 'iso_code': iso_lang, 'name': lang_name, - 'translatable': 1, + 'active': True, + 'translatable': True, 'date_format' : fix_datetime_format(locale.nl_langinfo(locale.D_FMT)), 'time_format' : fix_datetime_format(locale.nl_langinfo(locale.T_FMT)), 'decimal_point' : fix_xa0(str(locale.localeconv()['decimal_point'])), @@ -139,8 +145,8 @@ class lang(osv.osv): 'thousands_sep':fields.char('Thousands Separator'), } _defaults = { - 'active': 1, - 'translatable': 0, + 'active': False, + 'translatable': False, 'direction': 'ltr', 'date_format':_get_default_date_format, 'time_format':_get_default_time_format, diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index 56c55d3bb6a..b10b01345a8 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -528,6 +528,7 @@ def scan_languages(): :returns: a list of (lang_code, lang_name) pairs :rtype: [(str, unicode)] """ + _logger.warning("scan_languages is deprecated") return sorted(ALL_LANGUAGES.iteritems(), key=lambda k: k[1]) def get_user_companies(cr, user):