1
# Python module to handle translations
3
# Shamlessly copied from the anaconda tree.
4
# $Id: translate.py,v 1.4 2003/10/08 22:48:48 skvidal Exp $
9
localedir = prefix + '/share/locale'
13
# What languages do we support?
20
langs.append(string.split(str, '.')[0])
21
# also add 2 character language code ...
26
def _readEnvironment():
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)
45
error = 'gettext.error'
47
def _lsbStrToInt(str):
48
return ord(str[0]) + \
49
(ord(str[1]) << 8) + \
50
(ord(str[2]) << 16) + \
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) + \
62
def _intToMsbStr(int):
63
return chr((int >> 24) & 0xff) + \
64
chr((int >> 16) & 0xff) + \
65
chr((int >> 8) & 0xff) + \
68
if _gettext_byteorder == 'msb':
69
return _msbStrToInt(str)
71
return _lsbStrToInt(str)
73
if _gettext_byteorder == 'msb':
74
return _intToMsbStr(str)
76
return _intToLsbStr(str)
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."""
82
# get access to the stack frame by generating an exception.
86
frame = sys.exc_traceback.tb_frame
87
frame = frame.f_back # caller's frame
91
return (frame.f_globals['__name__'],
96
def __init__(self, domain=None, localedir=localedir):
98
self.localedir = localedir
100
if not domain: return
101
for self.lang in lang:
104
catalog = "%s/%s/LC_MESSAGES/%s.mo" % (
105
localedir, self.lang, domain)
107
f = open(catalog, "r")
115
return # assume C locale
117
if _StrToInt(buffer[:4]) != 0x950412de:
118
# magic number doesn't match
119
raise error, 'Bad magic number in %s' % (catalog,)
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:
128
origOffset = _StrToInt(buffer[origTabOffset+4:
130
origTabOffset = origTabOffset + 8
131
origStr = buffer[origOffset:origOffset+origLength]
133
transLength = _StrToInt(buffer[transTabOffset:
135
transOffset = _StrToInt(buffer[transTabOffset+4:
137
transTabOffset = transTabOffset + 8
138
transStr = buffer[transOffset:transOffset+transLength]
140
self.cat[origStr] = transStr
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]
148
# allow catalog access as cat(str) and cat[str] and cat.gettext(str)
149
__getitem__ = gettext
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"""
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
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'
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))
188
def bindtextdomain(domain, localedir=localedir):
190
if not _cats.has_key(domain):
191
_cats[domain] = Catalog(domain, localedir)
192
if not _cat: _cat = _cats[domain]
194
def textdomain(domain):
196
if not _cats.has_key(domain):
197
_cats[domain] = Catalog(domain)
201
if _cat == None: raise error, "No catalog loaded"
202
return _cat.gettext(string)
204
def dgettext(domain, string):
206
return gettext(string)
207
if not _cats.has_key(domain):
208
raise error, "Domain '" + domain + "' not loaded"
209
return _cats[domain].gettext(string)
214
if len(sys.argv) not in (2, 3):
215
print "Usage: %s DOMAIN [LOCALEDIR]" % (sys.argv[0],)
218
if len(sys.argv) == 3:
219
bindtextdomain(domain, sys.argv[2])
221
info = gettext('') # this is where special info is often stored
223
print "Info for domain %s, lang %s." % (domain, _cat.lang)
226
print "No info given in mo file."
232
def setlangs(newlang):
235
if type(newlang) == type(""):
238
langs = _expandLang(l)
245
arch = os.uname ()[4]
246
if (len (arch) == 4 and arch[0] == 'i' and arch[2:4] == "86"):
249
if arch == "sparc64":
254
###################################################################
255
# Now the real module code
257
if getArch() == 'sparc':
258
_gettext_byteorder = 'msb'
260
_gettext_byteorder = 'lsb'
265
self.cat = Catalog("yum")
270
def setlangs(self, langs):
271
self.langs = setlangs(langs)
272
self.cat = Catalog("yum")
274
def gettext(self, string):
275
return self.cat.gettext(string)