You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-3-lib/pym/calculate/lib/variables/locale.py

330 lines
10 KiB

#-*- coding: utf-8 -*-
# Copyright 2008-2013 Calculate Ltd. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from os import path
import os
import socket
from calculate.lib.datavars import Variable,VariableError,ReadonlyVariable
from calculate.lib.utils.common import (getValueFromCmdLine,
getValueFromConfig)
import sys
from calculate.lib.cl_lang import setLocalTranslate,getLazyLocalTranslate
setLocalTranslate('cl_lib3',sys.modules[__name__])
__ = getLazyLocalTranslate(_)
class Locale:
langData = {
'be_BY' : {
'name':__('Belarussian'),
'locale':'be_BY.UTF-8',
'keymap':'by',
'dumpkeys_charset': 'koi8-u',
'consolefont':'Cyr_a8x16',
'xkblayout':'us,by',
'language':'be',
},
'bg_BG' : {
'name':__('Bulgarian'),
'locale':'bg_BG.UTF-8',
'keymap':'bg_bds-utf8',
'dumpkeys_charset': '',
'consolefont':'ter-m14n',
'xkblayout':'us,bg',
'language':'bg',
},
'fr_BE' : {
'name':__('Belgian'),
'locale':'fr_BE.UTF-8',
'keymap':'be-latin1',
'dumpkeys_charset':'',
'consolefont':'lat9w-16',
'xkblayout':'us,be',
'language':'fr',
},
'pt_BR' : {
'name':__('Brazilian Portuguese'),
'locale':'pt_BR.UTF-8',
'keymap':'br-abnt2',
'dumpkeys_charset':'',
'consolefont':'lat9w-16',
'xkblayout':'pt,us',
'language':'pt_BR',
},
'fr_CA' : {
'name':__('Canadian French'),
'locale':'fr_CA.UTF-8',
'keymap':'cf',
'dumpkeys_charset':'',
'consolefont':'default8x16',
'xkblayout':'us,ca_enhanced',
'language':'fr',
},
'da_DK' : {
'name':__('Danish'),
'locale':'da_DK.UTF-8',
'keymap':'dk-latin1',
'dumpkeys_charset':'',
'consolefont':'lat0-16',
'xkblayout':'us,dk',
'language':'da',
},
'fr_FR' : {
'name':__('French'),
'locale':'fr_FR.UTF-8',
'keymap':'fr-latin9',
'dumpkeys_charset':'',
'consolefont':'lat0-16',
'xkblayout':'fr,us',
'language':'fr',
},
'de_DE' : {
'name':__('German'),
'locale':'de_DE.UTF-8',
'keymap':'de-latin1',
'dumpkeys_charset':'',
'consolefont':'lat9w-16',
'xkblayout':'de,us',
'language':'de',
},
'is_IS' : {
'name':__('Icelandic'),
'locale':'is_IS.UTF-8',
'keymap':'is-latin1',
'dumpkeys_charset':'',
'consolefont':'cp850-8x16',
'xkblayout':'us,is',
'language':'is',
},
'it_IT' : {
'name':__('Italian'),
'locale':'it_IT.UTF-8',
'keymap':'it',
'dumpkeys_charset':'',
'consolefont':'default8x16',
'xkblayout':'us,it',
'language':'it',
},
'nn_NO' : {
'name':__('Norwegian'),
'locale':'nn_NO.UTF-8',
'keymap':'no-latin1',
'dumpkeys_charset':'',
'consolefont':'lat9w-16',
'xkblayout':'us,no',
'language':'nn',
},
'pl_PL' : {
'name':__('Polish'),
'locale':'pl_PL.UTF-8',
'keymap':'pl',
'dumpkeys_charset':'',
'consolefont':'lat2-16',
'xkblayout':'us,pl',
'language':'pl',
},
'pt_PT' : {
'name':__('Portuguese'),
'locale':'pl_PL.UTF-8@euro',
'keymap':'pt-latin9',
'dumpkeys_charset':'',
'consolefont':'lat0-16',
'xkblayout':'pt,us',
'language':'pt',
},
'ro_RO' : {
'name':__('Romanian'),
'locale':'ro_RO.UTF-8',
'keymap':'ro_win',
'dumpkeys_charset':'',
'consolefont':'lat2-16',
'xkblayout':'ro,us',
'language':'ro',
},
'ru_RU' : {
'name':__('Russian'),
'locale':'ru_RU.UTF-8',
'keymap':'-u ruwin_cplk-UTF-8',
'dumpkeys_charset':'',
'consolefont':'ter-k14n',
'xkblayout':'us,ru(winkeys)',
'language':'ru',
},
'es_ES' : {
'name':__('Spanish'),
'locale':'es_ES.UTF-8',
'keymap':'es euro2',
'dumpkeys_charset':'',
'consolefont':'lat0-16',
'xkblayout':'es,us',
'language':'es',
},
'sv_SE' : {
'name':__('Swedish'),
'locale':'sv_SE.UTF-8',
'keymap':'sv-latin1',
'dumpkeys_charset':'',
'consolefont':'lat0-16',
'xkblayout':'us,se',
'language':'sv',
},
'uk_UA' : {
'name':__('Ukrainian'),
'locale':'uk_UA.UTF-8',
'keymap':'ua-utf',
'dumpkeys_charset':'koi8-u',
'consolefont':'ter-v14n',
'xkblayout':'us,ua(winkeys)',
'language':'ua',
},
'en_GB' : {
'name':__('United Kingdom/British'),
'locale':'en_GB.UTF-8',
'keymap':'uk',
'dumpkeys_charset':'',
'consolefont':'LatArCyrHeb-16',
'xkblayout':'us,gb',
'language':'en',
},
'en_US' : {
'name':__('United States/English'),
'locale':'en_US.UTF-8',
'keymap':'us',
'dumpkeys_charset':'',
'consolefont':'LatArCyrHeb-16',
'xkblayout':'us',
'language':'en',
}
}
def getLangs(self):
return self.langData.keys()
def getLanguages(self):
return map(lambda x:self.langData[x]['language'],
self.langData.keys())
def isLangExists(self,lang):
return lang in self.langData.keys()
def isValueInFieldExists(self,field,value):
return value in map(lambda x:self.langData[x][field],
self.langData.keys())
def getFields(self,field):
return [ l[1][field] for l in self.langData.items() ]
def getFieldByLang(self,field,lang):
return self.langData.get(lang, self.langData['en_US'])[field]
def getFieldByKeymap(self,field,keymap):
return self.langData.get(self.getLangByField('keymap',keymap),
self.langData['en_US'])[field]
def getLangByField(self,field,value):
langs = [lang[0] for lang in self.langData.items()
if lang[1][field] == value ]
if not langs:
return 'en_US'
else:
return langs[0]
class VariableOsClockTimezone(ReadonlyVariable):
"""
Current timezone
"""
def get(self):
zoneinfodir = "/usr/share/zoneinfo/"
localtimefile = "/etc/localtime"
timezonefile = "/etc/timezone"
# try get timezone from kernel calculate param
timezone = getValueFromCmdLine("calculate",2)
if timezone and \
path.exists(path.join(zoneinfodir,timezone)):
return timezone
# get timezone from /etc/timezone
if path.exists(timezonefile):
return open(timezonefile,"r").read().strip()
return "UTC"
class VariableOsLocaleLocale(ReadonlyVariable,Locale):
"""
Locale (example: ru_RU.UTF-8)
"""
def get(self):
# get locale from boot calculate param
localeFile = '/etc/env.d/02locale'
localeVal = getValueFromCmdLine("calculate",0)
if self.isLangExists(localeVal):
return self.getFieldByLang('locale',localeVal)
else:
localeVal = getValueFromConfig(localeFile,'LANG')
if self.isValueInFieldExists('locale',localeVal):
return localeVal
if os.environ.has_key("LANG") and os.environ["LANG"] != "C":
return os.environ["LANG"]
return self.getFieldByLang("locale","default")
class VariableOsLocaleLang(ReadonlyVariable,Locale):
"""
Language (example: ru_RU)
"""
def get(self):
"""lang (example: ru_RU)"""
return self.getLangByField("locale",self.Get('os_locale_locale'))
class VariableOsLocaleLanguage(ReadonlyVariable,Locale):
"""
Short lang name (example: ru)
"""
def get(self):
return self.getFieldByLang("language",self.Get('os_locale_lang'))
class VariableOsLocaleXkb(ReadonlyVariable,Locale):
"""
Keyboard layout for X server (example: us,ru)
"""
def get(self):
"""xkb layouts (example: en,ru)"""
return self.getFieldByLang("xkblayout", self.Get('os_locale_lang'))
class VariableOsLocaleXkbname(ReadonlyVariable,Locale):
"""
Keyboard layout name for X server (remove value in hooks)
"""
def get(self):
localeXkb = self.Get("os_locale_xkb")
if localeXkb:
return localeXkb.split("(")[0]
return ""
class VariableOsLang(ReadonlyVariable,Locale):
"""
Supported langs
"""
type = "list"
def get(self):
return list(sorted(list(set(self.getLangs()) &
set(["en_US","de_DE","es_ES","fr_FR","it_IT","pl_PL","pt_BR",
"uk_UA","bg_BG","ru_RU","ro_RO","pt_PT"]))))
def humanReadable(self):
return map(lambda x:self.getFieldByLang("name",x),
self.Get())