[IMP] base: remove hard-coded list of languages, read them from database or csv

Also add helper methods on `res.lang` to retrieve the list of installed
languages and the list of available languages.
This commit is contained in:
Raphael Collet
2015-10-26 17:34:34 +01:00
parent 5aa459a18e
commit f25e859a22
7 changed files with 51 additions and 97 deletions
+1 -2
View File
@@ -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 = []
+1 -3
View File
@@ -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)
@@ -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 = {}
+20 -5
View File
@@ -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)
#
+1 -2
View File
@@ -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')
+1 -2
View File
@@ -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):
+18 -81
View File
@@ -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):