diff --git a/addons/l10n_multilang/l10n_multilang.py b/addons/l10n_multilang/l10n_multilang.py index 58cd5834796..ddd7945bed7 100644 --- a/addons/l10n_multilang/l10n_multilang.py +++ b/addons/l10n_multilang/l10n_multilang.py @@ -44,8 +44,7 @@ class AccountChartTemplate(models.Model): @api.multi def process_coa_translations(self): - installed_lang_ids = self.env['res.lang'].search([]) - installed_langs = [x.code for x in installed_lang_ids] + installed_langs = dict(self.env['res.lang'].get_installed()) company_obj = self.env['res.company'] for chart_template_id in self: langs = [] diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index cb95bad942d..7576b12d767 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -305,9 +305,7 @@ class PaymentTransaction(osv.Model): _rec_name = 'reference' def _lang_get(self, cr, uid, context=None): - lang_ids = self.pool['res.lang'].search(cr, uid, [], context=context) - languages = self.pool['res.lang'].browse(cr, uid, lang_ids, context=context) - return [(language.code, language.name) for language in languages] + return self.pool['res.lang'].get_installed(cr, uid, context=context) def _default_partner_country_id(self, cr, uid, context=None): comp = self.pool['res.company'].browse(cr, uid, context.get('company_id', 1), context=context) diff --git a/openerp/addons/base/module/wizard/base_language_install.py b/openerp/addons/base/module/wizard/base_language_install.py index 258e4aa678a..e89f44e91b2 100644 --- a/openerp/addons/base/module/wizard/base_language_install.py +++ b/openerp/addons/base/module/wizard/base_language_install.py @@ -1,24 +1,31 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from operator import itemgetter + from openerp import tools from openerp.osv import osv, fields from openerp.tools.translate import _ class base_language_install(osv.osv_memory): """ Install Language""" - _name = "base.language.install" _description = "Install Language" + + def _languages(self, cr, uid, context=None): + return self.pool['res.lang'].get_available(cr, uid, context=context) + _columns = { - 'lang': fields.selection(tools.scan_languages(),'Language', required=True), + 'lang': fields.selection(_languages, 'Language', required=True), 'overwrite': fields.boolean('Overwrite Existing Terms', help="If you check this box, your customized translations will be overwritten and replaced by the official ones."), 'state':fields.selection([('init','init'),('done','done')], 'Status', readonly=True), } + _defaults = { 'state': 'init', 'overwrite': False } + def lang_install(self, cr, uid, ids, context=None): if context is None: context = {} diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index eb797f720f4..8a7f338e297 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -4,6 +4,7 @@ import locale from locale import localeconv import logging +from operator import itemgetter import re from openerp import tools @@ -67,7 +68,7 @@ class lang(osv.osv): _logger.warning(msg, lang, lc) if not lang_name: - lang_name = tools.ALL_LANGUAGES.get(lang, lang) + lang_name = lang def fix_xa0(s): """Fix badly-encoded non-breaking space Unicode character from locale.localeconv(), @@ -181,6 +182,22 @@ class lang(osv.osv): grouping = lang_obj.grouping return grouping, thousands_sep, decimal_point + @tools.ormcache() + def get_available(self, cr, uid, context=None): + """ Return the available languages as a list of (code, name) sorted by name. """ + langs = self.browse(cr, uid, self.search(cr, uid, [], context={'active_test': False})) + return sorted([(lang.code, lang.name) for lang in langs], key=itemgetter(1)) + + @tools.ormcache() + def get_installed(self, cr, uid, context=None): + """ Return the installed languages as a list of (code, name) sorted by name. """ + langs = self.browse(cr, uid, self.search(cr, uid, [])) + return sorted([(lang.code, lang.name) for lang in langs], key=itemgetter(1)) + + def create(self, cr, uid, vals, context=None): + self.clear_caches() + return super(lang, self).create(cr, uid, vals, context=context) + def write(self, cr, uid, ids, vals, context=None): if isinstance(ids, (int, long)): ids = [ids] @@ -195,8 +212,7 @@ class lang(osv.osv): if users.search(cr, uid, [('lang', '=', current_language.code)], context=context): raise UserError(_("Cannot unactivate a language that is currently used by users.")) - self._lang_get.clear_cache(self) - self._lang_data_get.clear_cache(self) + self.clear_caches() return super(lang, self).write(cr, uid, ids, vals, context) def unlink(self, cr, uid, ids, context=None): @@ -214,8 +230,7 @@ class lang(osv.osv): trans_obj = self.pool.get('ir.translation') trans_ids = trans_obj.search(cr, uid, [('lang','=',language['code'])], context=context) trans_obj.unlink(cr, uid, trans_ids, context=context) - self._lang_get.clear_cache(self) - self._lang_data_get.clear_cache(self) + self.clear_caches() return super(lang, self).unlink(cr, uid, ids, context=context) # diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index f51adfbc27e..b0567b0002a 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -143,8 +143,7 @@ class res_partner_title(osv.osv): @api.model def _lang_get(self): - languages = self.env['res.lang'].search([]) - return [(language.code, language.name) for language in languages] + return self.env['res.lang'].get_installed() ADDRESS_FIELDS = ('street', 'street2', 'zip', 'city', 'state_id', 'country_id') diff --git a/openerp/addons/test_new_api/models.py b/openerp/addons/test_new_api/models.py index 8db862c3b57..755f7af285d 100644 --- a/openerp/addons/test_new_api/models.py +++ b/openerp/addons/test_new_api/models.py @@ -212,8 +212,7 @@ class MixedModel(models.Model): @api.model def _get_lang(self): - langs = self.env['res.lang'].search([]) - return [(lang.code, lang.name) for lang in langs] + return self.env['res.lang'].get_installed() @api.model def _reference_models(self): diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index b10b01345a8..b36b1f63d8b 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -25,6 +25,8 @@ from lxml import etree from which import which from threading import local import traceback +import csv +from operator import itemgetter try: from html2text import html2text @@ -443,93 +445,28 @@ def get_iso_codes(lang): lang = lang.split('_')[0] return lang -ALL_LANGUAGES = { - 'am_ET': u'Amharic / አምሃርኛ', - 'ar_SY': u'Arabic / الْعَرَبيّة', - 'bg_BG': u'Bulgarian / български език', - 'bs_BA': u'Bosnian / bosanski jezik', - 'ca_ES': u'Catalan / Català', - 'cs_CZ': u'Czech / Čeština', - 'da_DK': u'Danish / Dansk', - 'de_DE': u'German / Deutsch', - 'el_GR': u'Greek / Ελληνικά', - 'en_AU': u'English (AU)', - 'en_GB': u'English (UK)', - 'en_US': u'English (US)', - 'es_AR': u'Spanish (AR) / Español (AR)', - 'es_BO': u'Spanish (BO) / Español (BO)', - 'es_CL': u'Spanish (CL) / Español (CL)', - 'es_CO': u'Spanish (CO) / Español (CO)', - 'es_CR': u'Spanish (CR) / Español (CR)', - 'es_DO': u'Spanish (DO) / Español (DO)', - 'es_EC': u'Spanish (EC) / Español (EC)', - 'es_ES': u'Spanish / Español', - 'es_GT': u'Spanish (GT) / Español (GT)', - 'es_MX': u'Spanish (MX) / Español (MX)', - 'es_PA': u'Spanish (PA) / Español (PA)', - 'es_PE': u'Spanish (PE) / Español (PE)', - 'es_PY': u'Spanish (PY) / Español (PY)', - 'es_UY': u'Spanish (UY) / Español (UY)', - 'es_VE': u'Spanish (VE) / Español (VE)', - 'et_EE': u'Estonian / Eesti keel', - 'eu_ES': u'Basque / Euskara', - 'fa_IR': u'Persian / فارس', - 'fi_FI': u'Finnish / Suomi', - 'fr_BE': u'French (BE) / Français (BE)', - 'fr_CA': u'French (CA) / Français (CA)', - 'fr_CH': u'French (CH) / Français (CH)', - 'fr_CA': u'French (CA) / Français (CA)', - 'fr_FR': u'French / Français', - 'gl_ES': u'Galician / Galego', - 'gu_IN': u'Gujarati / ગુજરાતી', - 'he_IL': u'Hebrew / עִבְרִי', - 'hi_IN': u'Hindi / हिंदी', - 'hr_HR': u'Croatian / hrvatski jezik', - 'hu_HU': u'Hungarian / Magyar', - 'id_ID': u'Indonesian / Bahasa Indonesia', - 'it_IT': u'Italian / Italiano', - 'ja_JP': u'Japanese / 日本語', - 'ka_GE': u'Georgian / ქართული ენა', - 'kab_DZ': u'Kabyle / Taqbaylit', - 'ko_KP': u'Korean (KP) / 한국어 (KP)', - 'ko_KR': u'Korean (KR) / 한국어 (KR)', - 'lo_LA': u'Lao / ພາສາລາວ', - 'lt_LT': u'Lithuanian / Lietuvių kalba', - 'lv_LV': u'Latvian / latviešu valoda', - 'mk_MK': u'Macedonian / македонски јазик', - 'mn_MN': u'Mongolian / монгол', - 'nb_NO': u'Norwegian Bokmål / Norsk bokmål', - 'nl_NL': u'Dutch / Nederlands', - 'nl_BE': u'Dutch (BE) / Nederlands (BE)', - 'pl_PL': u'Polish / Język polski', - 'pt_BR': u'Portuguese (BR) / Português (BR)', - 'pt_PT': u'Portuguese / Português', - 'ro_RO': u'Romanian / română', - 'ru_RU': u'Russian / русский язык', - 'sl_SI': u'Slovenian / slovenščina', - 'sk_SK': u'Slovak / Slovenský jazyk', - 'sq_AL': u'Albanian / Shqip', - 'sr_RS': u'Serbian (Cyrillic) / српски', - 'sr@latin': u'Serbian (Latin) / srpski', - 'sv_SE': u'Swedish / svenska', - 'te_IN': u'Telugu / తెలుగు', - 'tr_TR': u'Turkish / Türkçe', - 'vi_VN': u'Vietnamese / Tiếng Việt', - 'uk_UA': u'Ukrainian / українська', - 'zh_CN': u'Chinese (CN) / 简体中文', - 'zh_HK': u'Chinese (HK)', - 'zh_TW': u'Chinese (TW) / 正體字', - 'th_TH': u'Thai / ภาษาไทย', - } - def scan_languages(): """ Returns all languages supported by OpenERP for translation :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]) + csvpath = openerp.modules.module.get_resource_path('base', 'res', 'res.lang.csv') + try: + # read (code, name) from languages in base/res/res.lang.csv + result = [] + with open(csvpath) as csvfile: + reader = csv.reader(csvfile, delimiter=',', quotechar='"') + fields = reader.next() + code_index = fields.index("code") + name_index = fields.index("name") + for row in reader: + result.append((ustr(row[code_index]), ustr(row[name_index]))) + except Exception: + _logger.error("Could not read %s", csvpath) + result = [] + + return sorted(result or [('en_US', u'English')], key=itemgetter(1)) def get_user_companies(cr, user): def _get_company_children(cr, ids):