/usr/share/pyshared/LanguageSelector/LangCache.py is in language-selector-common 0.79.4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | import warnings
warnings.filterwarnings("ignore", "apt API not stable yet", FutureWarning)
import apt
import language_support_pkgs
class LanguagePackageStatus(object):
def __init__(self, languageCode, pkg_template):
self.languageCode = languageCode
self.pkgname_template = pkg_template
self.available = False
self.installed = False
self.doChange = False
def __str__(self):
return 'LanguagePackageStatus(langcode: %s, pkgname %s, available: %s, installed: %s, doChange: %s' % (
self.languageCode, self.pkgname_template, str(self.available),
str(self.installed), str(self.doChange))
# the language-support information
class LanguageInformation(object):
def __init__(self, cache, languageCode=None, language=None):
#FIXME:
#needs a new structure:
#languagePkgList[LANGCODE][tr|fn|in|wa]=[packages available for that language in that category]
#@property for each category
#@property for each LANGCODE
self.languageCode = languageCode
self.language = language
# langPack/support status
self.languagePkgList = {}
self.languagePkgList["languagePack"] = LanguagePackageStatus(languageCode, "language-pack-%s")
for langpkg_status in self.languagePkgList.itervalues():
pkgname = langpkg_status.pkgname_template % languageCode
langpkg_status.available = pkgname in cache
if langpkg_status.available:
langpkg_status.installed = cache[pkgname].is_installed
@property
def inconsistent(self):
" returns True if only parts of the language support packages are installed "
if (not self.notInstalled and not self.fullInstalled) : return True
return False
@property
def fullInstalled(self):
" return True if all of the available language support packages are installed "
for pkg in self.languagePkgList.values() :
if not pkg.available : continue
if not ((pkg.installed and not pkg.doChange) or (not pkg.installed and pkg.doChange)) : return False
return True
@property
def notInstalled(self):
" return True if none of the available language support packages are installed "
for pkg in self.languagePkgList.values() :
if not pkg.available : continue
if not ((not pkg.installed and not pkg.doChange) or (pkg.installed and pkg.doChange)) : return False
return True
@property
def changes(self):
" returns true if anything in the state of the language packs/support changes "
for pkg in self.languagePkgList.values() :
if (pkg.doChange) : return True
return False
def __str__(self):
return "%s (%s)" % (self.language, self.languageCode)
# the pkgcache stuff
class ExceptionPkgCacheBroken(Exception):
pass
class LanguageSelectorPkgCache(apt.Cache):
def __init__(self, localeinfo, progress):
apt.Cache.__init__(self, progress)
if self._depcache.broken_count > 0:
raise ExceptionPkgCacheBroken()
self._localeinfo = localeinfo
self.lang_support = language_support_pkgs.LanguageSupport(self)
@property
def havePackageLists(self):
" verify that a network package lists exists "
for metaindex in self._list.list:
for indexfile in metaindex.index_files:
if indexfile.archive_uri("").startswith("cdrom:"):
continue
if indexfile.archive_uri("").startswith("http://security.ubuntu.com"):
continue
if indexfile.label != "Debian Package Index":
continue
if indexfile.exists and indexfile.has_packages:
return True
return False
def clear(self):
""" clear the selections """
self._depcache.init()
def getChangesList(self):
to_inst = []
to_rm = []
for pkg in self.get_changes():
if pkg.marked_install or pkg.marked_upgrade:
to_inst.append(pkg.name)
if pkg.marked_delete:
to_rm.append(pkg.name)
return (to_inst,to_rm)
def tryChangeDetails(self, li):
" commit changed status of list items"""
# we iterate over items of type LanguagePackageStatus
for (key, item) in li.languagePkgList.iteritems():
if item.doChange:
pkgs = self.lang_support.by_locale(li.languageCode, installed=item.installed)
#print "XXX pkg list for lang %s, installed: %s" % (item.languageCode, str(item.installed))
try:
if item.installed:
# We are selective when deleting language support packages to
# prevent removal of packages that are not language specific.
for pkgname in pkgs:
if pkgname.startswith('language-pack-') or \
pkgname.endswith('-' + li.languageCode):
self[pkgname].mark_delete()
else:
for pkgname in pkgs:
self[pkgname].mark_install()
except SystemError:
raise ExceptionPkgCacheBroken()
def getLanguageInformation(self):
""" returns a list with language packs/support packages """
res = []
for (code, lang) in self._localeinfo._lang.items():
if code == 'zh':
continue
li = LanguageInformation(self, code, lang)
if [s for s in li.languagePkgList.itervalues() if s.available]:
res.append(li)
return res
if __name__ == "__main__":
from LocaleInfo import LocaleInfo
datadir = "/usr/share/language-selector"
li = LocaleInfo("languagelist", datadir)
lc = LanguageSelectorPkgCache(li,apt.progress.OpProgress())
print "available language information"
print ", ".join(["%s" %x for x in lc.getLanguageInformation()])
|