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.
330 lines
10 KiB
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())
|