~ubuntu-langpack/langpack-o-matic/main

« back to all changes in this revision

Viewing changes to lib/localeinfo.py

  • Committer: Sebastien Bacher
  • Date: 2021-11-22 16:04:05 UTC
  • mfrom: (594.2.1 langpack-o-matic)
  • Revision ID: seb128@ubuntu.com-20211122160405-17hx41i98tvg459q
The repository has been moved to git

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
'''Information about supported locales, countries, and languages.'''
2
 
 
3
 
# this is part of langpack-o-matic, by Martin Pitt <martin.pitt@canonical.com>
4
 
# (C) 2005 Canonical Ltd.
5
 
 
6
 
import os.path
7
 
import tempfile
8
 
import shutil
9
 
import tarfile
10
 
import logging
11
 
import sys
12
 
 
13
 
 
14
 
class SupportedLocales:
15
 
    def __init__(self):
16
 
        self.languages = {}
17
 
        mapdir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
18
 
                              '..', 'maps')
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
23
 
 
24
 
        self.countries = {}
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
29
 
 
30
 
        self.locales = {}
31
 
        for s in open(os.path.join(mapdir, 'supported-locales')):
32
 
            (l, e) = s.split()
33
 
            self.locales[l] = e
34
 
 
35
 
        self.pkglocales = {}
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)
43
 
 
44
 
    def known_language(self, lang):
45
 
        '''Return whether the given language is supported.
46
 
 
47
 
        >>> import localeinfo
48
 
        >>> sl = localeinfo.SupportedLocales()
49
 
        >>> sl.known_language('en')
50
 
        True
51
 
        >>> sl.known_language('de')
52
 
        True
53
 
        >>> sl.known_language('xx')
54
 
        False
55
 
        '''
56
 
 
57
 
        return lang in self.languages
58
 
 
59
 
    def known_country(self, country):
60
 
        '''Return whether the given language is supported.
61
 
 
62
 
        >>> import localeinfo
63
 
        >>> sl = localeinfo.SupportedLocales()
64
 
        >>> sl.known_country('GB')
65
 
        True
66
 
        >>> sl.known_country('US')
67
 
        True
68
 
        >>> sl.known_country('DE')
69
 
        True
70
 
        >>> sl.known_country('EN')
71
 
        False
72
 
        '''
73
 
 
74
 
        return country in self.countries
75
 
 
76
 
    def known_locale(self, locale):
77
 
        '''Return whether the given locale is supported.
78
 
 
79
 
        >>> import localeinfo
80
 
        >>> sl = localeinfo.SupportedLocales()
81
 
        >>> sl.known_locale('en_GB.UTF-8')
82
 
        True
83
 
        >>> sl.known_locale('de_DE.UTF-8')
84
 
        True
85
 
        >>> sl.known_locale('de_DE@euro')
86
 
        False
87
 
        >>> sl.known_locale('de_DE@euro.UTF-8')
88
 
        False
89
 
        >>> sl.known_locale('xx_XX')
90
 
        False
91
 
        '''
92
 
 
93
 
        return locale in self.locales
94
 
 
95
 
    def language_name(self, code):
96
 
        '''Return the name of the given language code.
97
 
 
98
 
        >>> import localeinfo
99
 
        >>> sl = localeinfo.SupportedLocales()
100
 
        >>> sl.language_name('de')
101
 
        'German'
102
 
        >>> sl.language_name('en')
103
 
        'English'
104
 
        >>> sl.language_name('xx')
105
 
        Traceback (most recent call last):
106
 
        KeyError: 'xx'
107
 
        '''
108
 
 
109
 
        return self.languages[code]
110
 
 
111
 
    def country_name(self, code):
112
 
        '''Return the name of the given country code.
113
 
 
114
 
        >>> import localeinfo
115
 
        >>> sl = localeinfo.SupportedLocales()
116
 
        >>> sl.country_name('GB')
117
 
        'United Kingdom'
118
 
        >>> sl.country_name('US')
119
 
        'United States'
120
 
        >>> sl.country_name('DE')
121
 
        'Germany'
122
 
        >>> sl.country_name('EN')
123
 
        Traceback (most recent call last):
124
 
        KeyError: 'EN'
125
 
        '''
126
 
 
127
 
        return self.countries[code]
128
 
 
129
 
    def language_locales(self, lang):
130
 
        '''Return a list with pairs (locale, encoding) that are supported for
131
 
        the given language code.
132
 
 
133
 
        Return empty list if language is unknown.
134
 
 
135
 
        >>> import localeinfo
136
 
        >>> sl=localeinfo.SupportedLocales()
137
 
        >>>
138
 
        >>> sl.language_locales('foo')
139
 
        []
140
 
        >>> sl.language_locales('cs') == [('cs_CZ.UTF-8', 'UTF-8')]
141
 
        True
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')]
148
 
        '''
149
 
 
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]]
152
 
        else:
153
 
            locales = [(l, e) for l, e in self.locales.items() if lang == l.split('.')[0].split('@')[0].split('_')[0]]
154
 
 
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)
158
 
 
159
 
        return locales
160
 
 
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.
164
 
 
165
 
        The returned tarball name is a temporary file that should be removed
166
 
        after using it.
167
 
 
168
 
        >>> import localeinfo, os, tarfile
169
 
        >>> sl = localeinfo.SupportedLocales()
170
 
        >>> tarname = sl.create_locale_tar('de')
171
 
 
172
 
        >>> tar = tarfile.open(tarname)
173
 
        >>> names = tar.getnames()
174
 
        >>> names.sort()
175
 
        >>> names
176
 
        ['var/lib/locales/supported.d/de']
177
 
        >>> print(tar.extractfile('var/lib/locales/supported.d/de').read().decode('UTF-8'))
178
 
        de_DE.UTF-8 UTF-8
179
 
        de_IT.UTF-8 UTF-8
180
 
        de_CH.UTF-8 UTF-8
181
 
        de_BE.UTF-8 UTF-8
182
 
        de_LI.UTF-8 UTF-8
183
 
        de_LU.UTF-8 UTF-8
184
 
        de_AT.UTF-8 UTF-8
185
 
        <BLANKLINE>
186
 
        >>> tar.close()
187
 
        >>> os.unlink(tarname)
188
 
        '''
189
 
 
190
 
        dir = None
191
 
        tar = None
192
 
        try:
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')
197
 
 
198
 
            sl = self.language_locales(lang)
199
 
 
200
 
            for loc, enc in sl:
201
 
                supp_list.write('%s %s\n' % (loc, enc))
202
 
 
203
 
            supp_list.close()
204
 
            (f, tar) = tempfile.mkstemp('.tar.gz')
205
 
            os.close(f)
206
 
 
207
 
            t = tarfile.open(tar, 'w:gz')
208
 
            old_cwd = os.getcwd()
209
 
            os.chdir(dir)
210
 
            t.add(os.path.join('var/lib/locales/supported.d', lang))
211
 
            os.chdir(old_cwd)
212
 
            t.close()
213
 
        finally:
214
 
            shutil.rmtree(dir, True)
215
 
 
216
 
        return tar
217
 
 
218
 
 
219
 
# unit test
220
 
if __name__ == '__main__':
221
 
    import doctest
222
 
    res = doctest.testmod()
223
 
    if res.failed != 0:
224
 
        sys.exit(1)