~ubuntu-branches/ubuntu/jaunty/yum/jaunty

« back to all changes in this revision

Viewing changes to translate.py

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings
  • Date: 2008-07-28 23:20:59 UTC
  • mfrom: (2.1.3 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080728232059-24lo1r17smhr71l8
Tags: 3.2.12-1.2
* Non-maintainer upload
* Updated for compatibility with current python-pyme (Closes: #490368)
  based on patch by Martin Meredith <mez@ubuntu.com>
  - Changed import in yum/misc.py
  - Set versioned dependency on python-pyme

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Python module to handle translations
2
 
#
3
 
# Shamlessly copied from the anaconda tree.
4
 
# $Id: translate.py,v 1.4 2003/10/08 22:48:48 skvidal Exp $
5
 
 
6
 
import os, string
7
 
 
8
 
prefix = '/usr'
9
 
localedir = prefix + '/share/locale'
10
 
_cat = None
11
 
_cats = {}
12
 
 
13
 
# What languages do we support?
14
 
lang = []
15
 
 
16
 
def _expandLang(str):
17
 
    langs = [str]
18
 
    # remove charset ...
19
 
    if '.' in str:
20
 
        langs.append(string.split(str, '.')[0])
21
 
        # also add 2 character language code ...
22
 
    if len(str) > 2:
23
 
        langs.append(str[:2])
24
 
    return langs
25
 
 
26
 
def _readEnvironment():
27
 
    global lang
28
 
    for env in 'LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG':
29
 
        if os.environ.has_key(env):
30
 
            lang = string.split(os.environ[env], ':')
31
 
            lang = map(_expandLang, lang)
32
 
            lang = reduce(lambda a, b: a + b, lang)
33
 
            break
34
 
    # remove duplicates
35
 
    newlang = []
36
 
    for l in lang:
37
 
        if not l in newlang:
38
 
            newlang.append(l)
39
 
    lang = newlang
40
 
    del newlang
41
 
    
42
 
if 'C' not in lang:
43
 
    lang.append('C')
44
 
 
45
 
error = 'gettext.error'
46
 
 
47
 
def _lsbStrToInt(str):
48
 
    return ord(str[0]) + \
49
 
           (ord(str[1]) << 8) + \
50
 
           (ord(str[2]) << 16) + \
51
 
           (ord(str[3]) << 24)
52
 
def _intToLsbStr(int):
53
 
    return chr(int         & 0xff) + \
54
 
           chr((int >> 8)  & 0xff) + \
55
 
           chr((int >> 16) & 0xff) + \
56
 
           chr((int >> 24) & 0xff)
57
 
def _msbStrToInt(str):
58
 
    return ord(str[3]) + \
59
 
           (ord(str[2]) << 8) + \
60
 
           (ord(str[1]) << 16) + \
61
 
           (ord(str[0]) << 24)
62
 
def _intToMsbStr(int):
63
 
    return chr((int >> 24) & 0xff) + \
64
 
           chr((int >> 16) & 0xff) + \
65
 
           chr((int >> 8) & 0xff) + \
66
 
           chr(int & 0xff)
67
 
def _StrToInt(str):
68
 
    if _gettext_byteorder == 'msb':
69
 
        return _msbStrToInt(str)
70
 
    else:
71
 
        return _lsbStrToInt(str)
72
 
def _intToStr(int):
73
 
    if _gettext_byteorder == 'msb':
74
 
        return _intToMsbStr(str)
75
 
    else:
76
 
        return _intToLsbStr(str)
77
 
 
78
 
def _getpos(levels = 0):
79
 
    """Returns the position in the code where the function was called.
80
 
    The function uses some knowledge about python stack frames."""
81
 
    import sys
82
 
    # get access to the stack frame by generating an exception.
83
 
    try:
84
 
        raise RuntimeError
85
 
    except RuntimeError:
86
 
        frame = sys.exc_traceback.tb_frame
87
 
    frame = frame.f_back # caller's frame
88
 
    while levels > 0:
89
 
        frame = frame.f_back
90
 
        levels = levels - 1
91
 
    return (frame.f_globals['__name__'],
92
 
            frame.f_code.co_name,
93
 
            frame.f_lineno)
94
 
 
95
 
class Catalog:
96
 
    def __init__(self, domain=None, localedir=localedir):
97
 
        self.domain = domain
98
 
        self.localedir = localedir
99
 
        self.cat = {}
100
 
        if not domain: return
101
 
        for self.lang in lang:
102
 
            if self.lang == 'C':
103
 
                return
104
 
            catalog = "%s/%s/LC_MESSAGES/%s.mo" % (
105
 
                    localedir, self.lang, domain)
106
 
            try:
107
 
                f = open(catalog, "r")
108
 
                buffer = f.read()
109
 
                f.close()
110
 
                del f
111
 
                break
112
 
            except IOError:
113
 
                pass
114
 
        else:
115
 
            return # assume C locale
116
 
 
117
 
        if _StrToInt(buffer[:4]) != 0x950412de:
118
 
            # magic number doesn't match
119
 
            raise error, 'Bad magic number in %s' % (catalog,)
120
 
 
121
 
        self.revision = _StrToInt(buffer[4:8])
122
 
        nstrings = _StrToInt(buffer[8:12])
123
 
        origTabOffset  = _StrToInt(buffer[12:16])
124
 
        transTabOffset = _StrToInt(buffer[16:20])
125
 
        for i in range(nstrings):
126
 
            origLength = _StrToInt(buffer[origTabOffset:
127
 
                                          origTabOffset+4])
128
 
            origOffset = _StrToInt(buffer[origTabOffset+4:
129
 
                                          origTabOffset+8])
130
 
            origTabOffset = origTabOffset + 8
131
 
            origStr = buffer[origOffset:origOffset+origLength]
132
 
 
133
 
            transLength = _StrToInt(buffer[transTabOffset:
134
 
                                           transTabOffset+4])
135
 
            transOffset = _StrToInt(buffer[transTabOffset+4:
136
 
                                           transTabOffset+8])
137
 
            transTabOffset = transTabOffset + 8
138
 
            transStr = buffer[transOffset:transOffset+transLength]
139
 
 
140
 
            self.cat[origStr] = transStr
141
 
 
142
 
    def gettext(self, string):
143
 
        """Get the translation of a given string"""
144
 
        if self.cat.has_key(string):
145
 
            return self.cat[string]
146
 
        else:
147
 
            return string
148
 
    # allow catalog access as cat(str) and cat[str] and cat.gettext(str)
149
 
    __getitem__ = gettext
150
 
    __call__ = gettext
151
 
 
152
 
    # this is experimental code for producing mo files from Catalog objects
153
 
    def __setitem__(self, string, trans):
154
 
        """Set the translation of a given string"""
155
 
        self.cat[string] = trans
156
 
    def save(self, file):
157
 
        """Create a .mo file from a Catalog object"""
158
 
        try:
159
 
            f = open(file, "wb")
160
 
        except IOError:
161
 
            raise error, "can't open " + file + " for writing"
162
 
        f.write(_intToStr(0x950412de))    # magic number
163
 
        f.write(_intToStr(0))             # revision
164
 
        f.write(_intToStr(len(self.cat))) # nstrings
165
 
 
166
 
        oIndex = []; oData = ''
167
 
        tIndex = []; tData = ''
168
 
        for orig, trans in self.cat.items():
169
 
            oIndex.append((len(orig), len(oData)))
170
 
            oData = oData + orig + '\0'
171
 
            tIndex.append((len(trans), len(tData)))
172
 
            tData = tData + trans + '\0'
173
 
        oIndexOfs = 20
174
 
        tIndexOfs = oIndexOfs + 8 * len(oIndex)
175
 
        oDataOfs = tIndexOfs + 8 * len(tIndex)
176
 
        tDataOfs = oDataOfs + len(oData)
177
 
        f.write(_intToStr(oIndexOfs))
178
 
        f.write(_intToStr(tIndexOfs))
179
 
        for length, offset in oIndex:
180
 
            f.write(_intToStr(length))
181
 
            f.write(_intToStr(offset + oDataOfs))
182
 
        for length, offset in tIndex:
183
 
            f.write(_intToStr(length))
184
 
            f.write(_intToStr(offset + tDataOfs))
185
 
        f.write(oData)
186
 
        f.write(tData)
187
 
 
188
 
def bindtextdomain(domain, localedir=localedir):
189
 
    global _cat
190
 
    if not _cats.has_key(domain):
191
 
        _cats[domain] = Catalog(domain, localedir)
192
 
    if not _cat: _cat = _cats[domain]
193
 
 
194
 
def textdomain(domain):
195
 
    global _cat
196
 
    if not _cats.has_key(domain):
197
 
        _cats[domain] = Catalog(domain)
198
 
    _cat = _cats[domain]
199
 
 
200
 
def gettext(string):
201
 
    if _cat == None: raise error, "No catalog loaded"
202
 
    return _cat.gettext(string)
203
 
 
204
 
def dgettext(domain, string):
205
 
    if domain is None:
206
 
        return gettext(string)
207
 
    if not _cats.has_key(domain):
208
 
        raise error, "Domain '" + domain + "' not loaded"
209
 
    return _cats[domain].gettext(string)
210
 
 
211
 
def test():
212
 
    import sys
213
 
    global localedir
214
 
    if len(sys.argv) not in (2, 3):
215
 
        print "Usage: %s DOMAIN [LOCALEDIR]" % (sys.argv[0],)
216
 
        sys.exit(1)
217
 
    domain = sys.argv[1]
218
 
    if len(sys.argv) == 3:
219
 
        bindtextdomain(domain, sys.argv[2])
220
 
    textdomain(domain)
221
 
    info = gettext('')  # this is where special info is often stored
222
 
    if info:
223
 
        print "Info for domain %s, lang %s." % (domain, _cat.lang)
224
 
        print info
225
 
    else:
226
 
        print "No info given in mo file."
227
 
 
228
 
def getlangs():
229
 
    global lang
230
 
    return lang
231
 
 
232
 
def setlangs(newlang):
233
 
    global lang
234
 
    lang = newlang
235
 
    if type(newlang) == type(""):
236
 
        lang = [ newlang ]
237
 
    for l in lang:
238
 
        langs = _expandLang(l)
239
 
        for nl in langs:
240
 
            if not nl in lang:
241
 
                lang.append(nl)
242
 
    return lang
243
 
 
244
 
def getArch ():
245
 
    arch = os.uname ()[4]
246
 
    if (len (arch) == 4 and arch[0] == 'i' and arch[2:4] == "86"):
247
 
        arch = "i386"
248
 
 
249
 
    if arch == "sparc64":
250
 
        arch = "sparc"
251
 
 
252
 
    return arch
253
 
 
254
 
###################################################################
255
 
# Now the real module code
256
 
 
257
 
if getArch() == 'sparc':
258
 
    _gettext_byteorder = 'msb'
259
 
else:
260
 
    _gettext_byteorder = 'lsb'
261
 
 
262
 
class i18n:
263
 
    def __init__(self):
264
 
        self.langs = lang
265
 
        self.cat = Catalog("yum")
266
 
 
267
 
    def getlangs(self):
268
 
        return self.langs
269
 
 
270
 
    def setlangs(self, langs):
271
 
        self.langs = setlangs(langs)
272
 
        self.cat = Catalog("yum")
273
 
 
274
 
    def gettext(self, string):
275
 
        return self.cat.gettext(string)
276
 
 
277
 
def N_(str):
278
 
    return str
279
 
 
280
 
_readEnvironment()
281
 
cat = i18n()
282
 
_ = cat.gettext