summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xanaconda3
-rw-r--r--pyanaconda/__init__.py10
-rw-r--r--pyanaconda/install.py1
-rw-r--r--pyanaconda/installclass.py1
-rw-r--r--pyanaconda/kickstart.py6
-rw-r--r--pyanaconda/language.py216
-rw-r--r--pyanaconda/localization.py35
-rw-r--r--pyanaconda/text.py8
-rw-r--r--tests/pyanaconda_test/language_test.py237
9 files changed, 42 insertions, 475 deletions
diff --git a/anaconda b/anaconda
index 0ca74a634..028a18569 100755
--- a/anaconda
+++ b/anaconda
@@ -910,9 +910,6 @@ if __name__ == "__main__":
if opts.lang:
# this is lame, but make things match what we expect (#443408)
opts.lang = opts.lang.replace(".utf8", ".UTF-8")
- anaconda.instLanguage.instLang = opts.lang
- anaconda.instLanguage.systemLang = opts.lang
- anaconda.ksdata.timezone.timezone = anaconda.instLanguage.getDefaultTimeZone()
from pyanaconda.storage import storageInitialize
from pyanaconda.packaging import payloadInitialize
diff --git a/pyanaconda/__init__.py b/pyanaconda/__init__.py
index 4c39841ed..2ac97c01a 100644
--- a/pyanaconda/__init__.py
+++ b/pyanaconda/__init__.py
@@ -56,7 +56,6 @@ class Anaconda(object):
self.firewall = firewall.Firewall()
self.id = None
self._instClass = None
- self._instLanguage = None
self._intf = None
self.isHeadless = False
self.ksdata = None
@@ -109,14 +108,6 @@ class Anaconda(object):
return self._instClass
- @property
- def instLanguage(self):
- if not self._instLanguage:
- import language
- self._instLanguage = language.Language(self.displayMode)
-
- return self._instLanguage
-
def _getInterface(self):
return self._intf
@@ -240,7 +231,6 @@ class Anaconda(object):
def write(self):
import network
self.writeXdriver()
- self.instLanguage.write()
network.write_sysconfig_network()
network.disableIPV6()
diff --git a/pyanaconda/install.py b/pyanaconda/install.py
index 0652d464a..d639df3af 100644
--- a/pyanaconda/install.py
+++ b/pyanaconda/install.py
@@ -86,6 +86,7 @@ def doInstall(storage, payload, ksdata, instClass):
ksdata.services.execute(storage, ksdata, instClass)
ksdata.keyboard.execute(storage, ksdata, instClass)
ksdata.timezone.execute(storage, ksdata, instClass)
+ ksdata.lang.execute(storage, ksdata, instClass)
writeNetworkConf(storage, ksdata, instClass)
diff --git a/pyanaconda/installclass.py b/pyanaconda/installclass.py
index 100c0721a..59dfea0a3 100644
--- a/pyanaconda/installclass.py
+++ b/pyanaconda/installclass.py
@@ -25,7 +25,6 @@ from distutils.sysconfig import get_python_lib
import os, sys, iutil
import isys
import string
-import language
import imputil
import types
diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
index ea45b7213..5782d5e76 100644
--- a/pyanaconda/kickstart.py
+++ b/pyanaconda/kickstart.py
@@ -50,6 +50,7 @@ from storage.devices import *
from pyanaconda import keyboard
from pyanaconda import ntp
from pyanaconda import timezone
+from pyanaconda import localization
from pyanaconda.simpleconfig import SimpleConfigFile
from pykickstart.base import KickstartCommand
@@ -535,6 +536,10 @@ class IscsiName(commands.iscsiname.FC6_IscsiName):
storage.iscsi.iscsi().initiator = self.iscsiname
return retval
+class Lang(commands.lang.FC3_Lang):
+ def execute(self, *args, **kwargs):
+ localization.write_language_configuration(self, ROOT_PATH)
+
class LogVol(commands.logvol.F17_LogVol):
def execute(self, storage, ksdata, instClass):
for l in self.lvList:
@@ -1380,6 +1385,7 @@ commandMap = {
"iscsi": Iscsi,
"iscsiname": IscsiName,
"keyboard": Keyboard,
+ "language": Lang,
"logging": Logging,
"logvol": LogVol,
"multipath": MultiPath,
diff --git a/pyanaconda/language.py b/pyanaconda/language.py
deleted file mode 100644
index 9c37e79db..000000000
--- a/pyanaconda/language.py
+++ /dev/null
@@ -1,216 +0,0 @@
-#
-# language.py: install data component that stores information about both
-# installer runtime language choice and installed system
-# language support.
-#
-# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2009 Red Hat, Inc.
-# All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-import os
-import string
-import locale
-
-import gettext
-from pyanaconda.constants import ROOT_PATH, DEFAULT_LANG
-import localization
-from simpleconfig import SimpleConfigFile
-
-import logging
-log = logging.getLogger("anaconda")
-
-class Language(object):
- def _setInstLang(self, value):
- # Always store in its full form so we know what we're comparing with.
- try:
- self._instLang = self._canonLang(value)
- except ValueError:
- # If the language isn't listed in lang-table, we won't know what
- # keyboard/etc. to use. However, we can still set the $LANG
- # to that and make sure it works in the installed system.
- self._instLang = value
-
- # If we're running in text mode, value may not be a supported language
- # to display. Fall back to the default for now.
- if self.displayMode == 't':
- for (lang, info) in self.localeInfo.iteritems():
- if lang == self._instLang and info[2] == "False":
- self._instLang = self._default
- break
-
- # Now set some things to make sure the language setting takes effect
- # right now.
- os.environ["LANG"] = self._instLang
- os.environ["LC_NUMERIC"] = "C"
-
- try:
- locale.setlocale(locale.LC_ALL, "")
- except locale.Error:
- pass
-
- # XXX: oh ick. this is the sort of thing which you should never do...
- # but we switch languages at runtime and thus need to invalidate
- # the set of languages/mofiles which gettext knows about
- gettext._translations = {}
-
- def _getInstLang(self):
- # If we were given a language that's not in lang-table, lie and say
- # we're using the default. This prevents us from having to check all
- # over the place.
- if self._instLang in self.localeInfo.keys():
- return self._instLang
- else:
- return self._default
-
- # The language being displayed while anaconda is running.
- instLang = property(lambda s: s._getInstLang(), lambda s, v: s._setInstLang(v))
-
- def _setSystemLang(self, value):
- # Always store in its full form so we know what we're comparing with.
- try:
- self._systemLang = self._canonLang(value)
- except ValueError:
- # If the language isn't listed in lang-table, we won't know what
- # keyboard/etc. to use. However, we can still set the $LANG
- # to that and make sure it works in the installed system.
- self._systemLang = value
-
- # Now set a bunch of other things that'll get written to
- # /etc/sysconfig/i18n on the installed system.
- self.info["LANG"] = self._systemLang
-
- if not self.localeInfo.has_key(self._systemLang):
- return
-
- if self.localeInfo[self._systemLang][2] == "False":
- self.info["SYSFONT"] = None
- else:
- self.info["SYSFONT"] = "latarcyrheb-sun16"
-
- # XXX hack - because of exceptional cases on the var - zh_CN.GB2312
- if self._systemLang == "zh_CN.GB18030":
- self.info["LANGUAGE"] = "zh_CN.GB18030:zh_CN.GB2312:zh_CN"
-
- # The language to use on the installed system. This can differ from the
- # language being used during anaconda. For instance, text installs cannot
- # display all languages (CJK, Indic, etc.).
- systemLang = property(lambda s: s._systemLang, lambda s, v: s._setSystemLang(v))
-
- def __init__ (self, display_mode = 'g'):
- self._default = DEFAULT_LANG
- self.displayMode = display_mode
- self.info = {}
- self.nativeLangNames = {}
-
- # English name -> native name mapping
- search = ('lang-names', '/usr/share/anaconda/lang-names')
- for path in search:
- if os.access(path, os.R_OK):
- f = open(path, 'r')
- for line in f.readlines():
- lang, native = string.split(line, '\t')
- native = native.strip()
- self.nativeLangNames[lang] = native
-
- f.close()
- break
-
- self.localeInfo = localeinfo.get(self._default)
-
- # instLang must be set after localeInfo is populated, in case the
- # current setting is unsupported by anaconda..
- self.instLang = os.environ.get("LANG", self._default)
- self.systemLang = os.environ.get("LANG", self._default)
-
- def _canonLang(self, lang):
- """Convert the shortened form of a language name into the full
- version. If it's not found, raise ValueError.
-
- Example: fr -> fr_FR.UTF-8
- fr_FR -> fr_FR.UTF-8
- fr_CA -> ValueError
- """
- for key in self.localeInfo.keys():
- if lang in localization.expand_langs(key):
- return key
-
- raise ValueError
-
- def available(self):
- return self.nativeLangNames.keys()
-
- def dracutSetupArgs(self):
- args=set()
-
- for (key, val) in self.info.iteritems():
- if val != None:
- args.add("%s=%s" % (key, val))
-
- return args
-
- def getCurrentLangSearchList(self):
- return localization.expand_langs(self.systemLang) + ['C']
-
- def getDefaultTimeZone(self):
- try:
- return self.localeInfo[self.systemLang][4]
- except KeyError:
- # If doing an upgrade and the system language is something not
- # recognized by anaconda, we should try to see if we can figure
- # it out from the running system.
- if os.path.exists(ROOT_PATH + "/etc/sysconfig/clock"):
- cfg = SimpleConfigFile()
- cfg.read(ROOT_PATH + "/etc/sysconfig/clock")
-
- try:
- return cfg.get("ZONE")
- except:
- return self.localeInfo[self._default][4]
- else:
- return self.localeInfo[self._default][4]
-
- def textSupported(self, lang):
- try:
- l = self._canonLang(lang)
- except ValueError:
- l = self._default
-
- return self.localeInfo[l][2]
-
- def getLangName(self, lang):
- try:
- l = self._canonLang(lang)
- except ValueError:
- l = self._default
-
- return self.localeInfo[l][0]
-
- def getLangByName(self, name):
- for (key, val) in self.localeInfo.iteritems():
- if val[0] == name:
- return key
-
- def getNativeLangName(self, lang):
- return self.nativeLangNames[lang]
-
- def write(self):
- f = open(ROOT_PATH + "/etc/sysconfig/i18n", "w")
-
- for (key, val) in self.info.iteritems():
- if val != None:
- f.write("%s=\"%s\"\n" % (key, val))
-
- f.close()
diff --git a/pyanaconda/localization.py b/pyanaconda/localization.py
index ff02d8a77..d3dda8a6e 100644
--- a/pyanaconda/localization.py
+++ b/pyanaconda/localization.py
@@ -30,6 +30,13 @@ import babel
LOCALE_PREFERENCES = {}
+SYSCONF_I18N_FILE_PATH = "/etc/sysconfig/i18n"
+LOCALE_CONF_FILE_PATH = "/etc/locale.conf"
+
+class LocalizationConfigError(Exception):
+ """Exception class for localization configuration related problems"""
+
+ pass
class LocaleInfo(object):
@@ -168,6 +175,34 @@ def expand_langs(astring):
return langs
+def write_language_configuration(lang, root):
+ """
+ Write language configuration to the $root/etc/sysconfig/i18n and the
+ $root/etc/locale.conf files.
+
+ @param lang: ksdata.lang object
+ @param root: path to the root of the installed system
+
+ """
+
+ try:
+ fpath = os.path.normpath(root + SYSCONF_I18N_FILE_PATH)
+ with open(fpath, "w") as fobj:
+ fobj.write('LANG="%s"\n' % lang.lang)
+
+ except IOError as ioerr:
+ msg = "Cannot write language configuration file: %s" % ioerr.strerror
+ raise LocalizationConfigError(msg)
+
+ try:
+ fpath = os.path.normpath(root + LOCALE_CONF_FILE_PATH)
+ with open(fpath, "w") as fobj:
+ fobj.write('LANG="%s"\n' % lang.lang)
+
+ except IOError as ioerr:
+ msg = "Cannot write language configuration file: %s" % ioerr.strerror
+ raise LocalizationConfigError(msg)
+
class PreferredLocale(object):
@staticmethod
diff --git a/pyanaconda/text.py b/pyanaconda/text.py
index f3c9c77fe..58dde913c 100644
--- a/pyanaconda/text.py
+++ b/pyanaconda/text.py
@@ -484,14 +484,6 @@ class InstallInterface(InstallInterfaceBase):
def run(self, anaconda):
self.anaconda = anaconda
- instLang = anaconda.instLanguage
-
- if not instLang.textSupported(instLang.instLang) and not anaconda.ksdata:
- ButtonChoiceWindow(self.screen, "Language Unavailable",
- "%s display is unavailable in text mode. "
- "The installation will continue in "
- "English." % (instLang.instLang,),
- buttons=[TEXT_OK_BUTTON])
if not self.isRealConsole():
self.screen.suspendCallback(spawnShell, self.screen)
diff --git a/tests/pyanaconda_test/language_test.py b/tests/pyanaconda_test/language_test.py
deleted file mode 100644
index 2325a7340..000000000
--- a/tests/pyanaconda_test/language_test.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/python
-
-import mock
-
-ENVIRON_LANG = 'en_US.utf8'
-
-class LanguageTest(mock.TestCase):
-
- def setUp(self):
- self.setupModules(["_isys", "block", "ConfigParser"])
-
- # Mock filesystem
- self.fs = mock.DiskIO()
-
- def fake_os_access(path, _):
- return path == 'lang-names'
-
- self.fs.open('lang-names', 'w').write(
- "Czech\tCestina\n"
- "English\tEnglish\n"
- "Hebrew\tHebrew")
-
- import pyanaconda.language
- pyanaconda.language.log = mock.Mock()
- pyanaconda.language.gettext = mock.Mock()
- pyanaconda.language.open = self.fs.open
- pyanaconda.language.os = mock.Mock()
- pyanaconda.language.os.access = fake_os_access
- pyanaconda.language.os.environ = {'LANG': ENVIRON_LANG}
- pyanaconda.language.locale = mock.Mock()
- pyanaconda.language.localeinfo.get = mock.Mock(return_value={
- 'C': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'),
- 'cs_CZ.UTF-8': ('Czech', 'cs', 'latarcyrheb-sun16', 'cz-lat2', 'Europe/Prague'),
- 'en_US.UTF-8': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'),
- 'he_IL.UTF-8': ('Hebrew', 'he', 'none', 'us', 'Asia/Jerusalem')})
-
- def tearDown(self):
- self.tearDownModules()
-
- def set_inst_lang_g_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang._setInstLang('cs')
- self.assertEqual(pyanaconda.language.os.environ.get('LANG'), 'cs_CZ.UTF-8')
- self.assertEqual(pyanaconda.language.os.environ.get('LC_NUMERIC'), 'C')
- self.assertTrue(pyanaconda.language.locale.setlocale.called)
- self.assertTrue(isinstance(pyanaconda.language.gettext._translations, dict))
-
- def set_inst_lang_t_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language('t')
- lang._setInstLang('he')
- self.assertEqual(pyanaconda.language.os.environ.get('LANG'), 'en_US.UTF-8')
- self.assertEqual(pyanaconda.language.os.environ.get('LC_NUMERIC'), 'C')
- self.assertTrue(pyanaconda.language.locale.setlocale.called)
- self.assertTrue(isinstance(pyanaconda.language.gettext._translations, dict))
-
- def get_inst_lang_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang._getInstLang()
- self.assertEqual(ret, 'en_US.UTF-8')
-
- def set_get_inst_lang_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang._setInstLang('cs')
- ret = lang._getInstLang()
- self.assertEqual(ret, 'cs_CZ.UTF-8')
-
- def set_system_lang_1_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang._setSystemLang('cs')
- self.assertEqual(lang.info.get('LANG'), 'cs_CZ.UTF-8')
- self.assertEqual(lang.info.get('SYSFONT', ''), 'latarcyrheb-sun16')
-
- def set_system_lang_2_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang._setSystemLang('he')
- self.assertEqual(lang.info.get('LANG'), 'he_IL.UTF-8')
- self.assertEqual(lang.info.get('SYSFONT', ''), None)
-
- def set_system_lang_3_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang._setSystemLang('foo')
- self.assertEqual(lang.info.get('LANG'), 'foo')
- self.assertFalse('SYSFONT' in lang.info)
-
- def system_lang_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang.systemLang = 'cs'
- self.assertEqual(lang.info,
- {'LANG': 'cs_CZ.UTF-8', 'SYSFONT': 'latarcyrheb-sun16'})
-
- def canon_lang_pass_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- self.assertEqual(lang._canonLang('cs_CZ.UTF-8'), 'cs_CZ.UTF-8')
- self.assertEqual(lang._canonLang('cs'), 'cs_CZ.UTF-8')
- self.assertEqual(lang._canonLang('cs_CZ'), 'cs_CZ.UTF-8')
-
- def canon_lang_raise_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- self.assertRaises(ValueError, lang._canonLang, 'CZ.UTF-8')
- self.assertRaises(ValueError, lang._canonLang, '')
- self.assertRaises(ValueError, lang._canonLang, 's_CZ')
- self.assertRaises(ValueError, lang._canonLang, 'foo')
-
- def available_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- self.assertEqual(set(lang.available()), set(['Czech', 'English', 'Hebrew']))
-
- def dracut_setup_args_default_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.dracutSetupArgs()
- self.assertEqual(ret, set(['LANG=%s' % ENVIRON_LANG]))
-
- def dracut_setup_args_after_set_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang.systemLang = 'cs'
- ret = lang.dracutSetupArgs()
- self.assertEqual(ret, set(['LANG=cs_CZ.UTF-8', 'SYSFONT=latarcyrheb-sun16']))
-
- def get_current_lang_search_list_default_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getCurrentLangSearchList()
- self.assertEqual(set(ret), set([ENVIRON_LANG, 'en_US', 'en', 'C']))
-
- def get_current_lang_search_list_after_set_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang.systemLang = 'cs'
- ret = lang.getCurrentLangSearchList()
- self.assertEqual(set(ret), set(['cs_CZ.UTF-8', 'cs_CZ', 'cs', 'C']))
-
- def get_default_time_zone_default_test(self):
- import pyanaconda.language
- pyanaconda.language.os.path.exists = mock.Mock(return_value=False)
- lang = pyanaconda.language.Language()
- ret = lang.getDefaultTimeZone()
- self.assertEqual(ret, 'America/New_York')
-
- def get_default_time_zone_with_cs_CZ_locale_test(self):
- import pyanaconda.language
- pyanaconda.language.os.environ = {'LANG': 'cs'}
- pyanaconda.language.os.path.exists = mock.Mock(return_value=False)
- lang = pyanaconda.language.Language()
- ret = lang.getDefaultTimeZone()
- self.assertEqual(ret, 'Europe/Prague')
-
- def get_default_time_zone_after_set_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang.systemLang = 'cs'
- ret = lang.getDefaultTimeZone()
- self.assertEqual(ret, 'Europe/Prague')
-
- def get_text_supported_1_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- self.assertTrue(lang.textSupported('cs'))
-
- def get_text_supported_2_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- self.assertFalse(lang.textSupported('he'))
-
- def get_lang_name_1_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getLangName('en')
- self.assertEqual(ret, 'English')
-
- def get_lang_name_2_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getLangName('cs')
- self.assertEqual(ret, 'Czech')
-
- def get_lang_name_3_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getLangName('he')
- self.assertEqual(ret, 'Hebrew')
-
- def get_lang_name_4_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getLangName('foo')
- self.assertEqual(ret, 'English')
-
- def get_lang_by_name_1_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getLangByName('English')
- self.assertEqual(ret, 'C')
-
- def get_lang_by_name_2_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getLangByName('Czech')
- self.assertEqual(ret, 'cs_CZ.UTF-8')
-
- def get_native_lang_name_1_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getNativeLangName('Czech')
- self.assertEqual(ret, 'Cestina')
-
- def get_native_lang_name_2_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.getNativeLangName('English')
- self.assertEqual(ret, 'English')
-
- def write_1_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- ret = lang.write()
- self.assertEqual(self.fs['/mnt/sysimage/etc/sysconfig/i18n'], 'LANG="%s"\n' % ENVIRON_LANG)
-
- def write_2_test(self):
- import pyanaconda.language
- lang = pyanaconda.language.Language()
- lang.systemLang = 'cs'
- ret = lang.write()
- self.assertEqual(self.fs['/mnt/sysimage/etc/sysconfig/i18n'],
- 'LANG="cs_CZ.UTF-8"\nSYSFONT="latarcyrheb-sun16"\n')