1
'''Information about supported locales, countries, and languages.'''
3
# this is part of langpack-o-matic, by Martin Pitt <martin.pitt@canonical.com>
4
# (C) 2005 Canonical Ltd.
14
class SupportedLocales:
17
mapdir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
19
for line in open(os.path.join(mapdir, 'languages')):
20
if line.find('#') == -1:
21
(code, name) = line.strip().split(':')
22
self.languages[code] = name
25
for line in open(os.path.join(mapdir, 'countries')):
26
if line.find('#') == -1 and line.find(':') >= 0:
27
(code, name) = line.strip().split(':')
28
self.countries[code] = name
31
for s in open(os.path.join(mapdir, 'supported-locales')):
36
for s in open(os.path.join(mapdir, 'locale2pkgname')):
37
(l, p) = s.strip().split(':')
38
(ll, cc) = l.split('-')
39
loc = "%s_%s" % (ll, cc.upper())
40
if p not in self.pkglocales:
41
self.pkglocales[p] = []
42
self.pkglocales[p].append(loc)
44
def known_language(self, lang):
45
'''Return whether the given language is supported.
48
>>> sl = localeinfo.SupportedLocales()
49
>>> sl.known_language('en')
51
>>> sl.known_language('de')
53
>>> sl.known_language('xx')
57
return lang in self.languages
59
def known_country(self, country):
60
'''Return whether the given language is supported.
63
>>> sl = localeinfo.SupportedLocales()
64
>>> sl.known_country('GB')
66
>>> sl.known_country('US')
68
>>> sl.known_country('DE')
70
>>> sl.known_country('EN')
74
return country in self.countries
76
def known_locale(self, locale):
77
'''Return whether the given locale is supported.
80
>>> sl = localeinfo.SupportedLocales()
81
>>> sl.known_locale('en_GB.UTF-8')
83
>>> sl.known_locale('de_DE.UTF-8')
85
>>> sl.known_locale('de_DE@euro')
87
>>> sl.known_locale('de_DE@euro.UTF-8')
89
>>> sl.known_locale('xx_XX')
93
return locale in self.locales
95
def language_name(self, code):
96
'''Return the name of the given language code.
99
>>> sl = localeinfo.SupportedLocales()
100
>>> sl.language_name('de')
102
>>> sl.language_name('en')
104
>>> sl.language_name('xx')
105
Traceback (most recent call last):
109
return self.languages[code]
111
def country_name(self, code):
112
'''Return the name of the given country code.
114
>>> import localeinfo
115
>>> sl = localeinfo.SupportedLocales()
116
>>> sl.country_name('GB')
118
>>> sl.country_name('US')
120
>>> sl.country_name('DE')
122
>>> sl.country_name('EN')
123
Traceback (most recent call last):
127
return self.countries[code]
129
def language_locales(self, lang):
130
'''Return a list with pairs (locale, encoding) that are supported for
131
the given language code.
133
Return empty list if language is unknown.
135
>>> import localeinfo
136
>>> sl=localeinfo.SupportedLocales()
138
>>> sl.language_locales('foo')
140
>>> sl.language_locales('cs') == [('cs_CZ.UTF-8', 'UTF-8')]
142
>>> sl.language_locales('eo')
143
[('eo', 'UTF-8'), ('eo_US.UTF-8', 'UTF-8')]
144
>>> sl.language_locales('zh-hans')
145
[('zh_CN.UTF-8', 'UTF-8'), ('zh_SG.UTF-8', 'UTF-8')]
146
>>> sorted(sl.language_locales('zh-hant'))
147
[('zh_HK.UTF-8', 'UTF-8'), ('zh_TW.UTF-8', 'UTF-8')]
150
if lang in self.pkglocales:
151
locales = [(l, e) for l, e in self.locales.items() if l.split('.')[0].split('@')[0] in self.pkglocales[lang]]
153
locales = [(l, e) for l, e in self.locales.items() if lang == l.split('.')[0].split('@')[0].split('_')[0]]
155
# maps consistency check
156
if len(locales) == 0 and self.known_language(lang):
157
logging.error('no supported locales for known language %s', lang)
161
def create_locale_tar(self, lang):
162
'''Generate a tarball (suitable for supplying as extra.tar) with
163
the /var/lib/locales/supported.d file.
165
The returned tarball name is a temporary file that should be removed
168
>>> import localeinfo, os, tarfile
169
>>> sl = localeinfo.SupportedLocales()
170
>>> tarname = sl.create_locale_tar('de')
172
>>> tar = tarfile.open(tarname)
173
>>> names = tar.getnames()
176
['var/lib/locales/supported.d/de']
177
>>> print(tar.extractfile('var/lib/locales/supported.d/de').read().decode('UTF-8'))
187
>>> os.unlink(tarname)
193
dir = tempfile.mkdtemp()
194
supported_dir = os.path.join(dir, 'var/lib/locales/supported.d')
195
os.makedirs(supported_dir)
196
supp_list = open(os.path.join(supported_dir, lang), 'w')
198
sl = self.language_locales(lang)
201
supp_list.write('%s %s\n' % (loc, enc))
204
(f, tar) = tempfile.mkstemp('.tar.gz')
207
t = tarfile.open(tar, 'w:gz')
208
old_cwd = os.getcwd()
210
t.add(os.path.join('var/lib/locales/supported.d', lang))
214
shutil.rmtree(dir, True)
220
if __name__ == '__main__':
222
res = doctest.testmod()