lib64
/
python2.7
/
Go to Home Directory
+
Upload
Create File
root@0UT1S:~$
Execute
By Order of Mr.0UT1S
[DIR] ..
N/A
[DIR] Demo
N/A
[DIR] Doc
N/A
[DIR] Tools
N/A
[DIR] bsddb
N/A
[DIR] compiler
N/A
[DIR] config
N/A
[DIR] ctypes
N/A
[DIR] curses
N/A
[DIR] distutils
N/A
[DIR] email
N/A
[DIR] encodings
N/A
[DIR] ensurepip
N/A
[DIR] hotshot
N/A
[DIR] idlelib
N/A
[DIR] importlib
N/A
[DIR] json
N/A
[DIR] lib-dynload
N/A
[DIR] lib-tk
N/A
[DIR] lib2to3
N/A
[DIR] logging
N/A
[DIR] multiprocessing
N/A
[DIR] plat-linux2
N/A
[DIR] pydoc_data
N/A
[DIR] site-packages
N/A
[DIR] sqlite3
N/A
[DIR] test
N/A
[DIR] unittest
N/A
[DIR] wsgiref
N/A
[DIR] xml
N/A
BaseHTTPServer.py
22.21 KB
Rename
Delete
BaseHTTPServer.pyc
21.21 KB
Rename
Delete
BaseHTTPServer.pyo
21.21 KB
Rename
Delete
Bastion.py
5.61 KB
Rename
Delete
Bastion.pyc
6.50 KB
Rename
Delete
Bastion.pyo
6.50 KB
Rename
Delete
CGIHTTPServer.py
12.78 KB
Rename
Delete
CGIHTTPServer.pyc
10.76 KB
Rename
Delete
CGIHTTPServer.pyo
10.76 KB
Rename
Delete
ConfigParser.py
27.10 KB
Rename
Delete
ConfigParser.pyc
24.62 KB
Rename
Delete
ConfigParser.pyo
24.62 KB
Rename
Delete
Cookie.py
25.92 KB
Rename
Delete
Cookie.pyc
22.13 KB
Rename
Delete
Cookie.pyo
22.13 KB
Rename
Delete
DocXMLRPCServer.py
10.52 KB
Rename
Delete
DocXMLRPCServer.pyc
9.96 KB
Rename
Delete
DocXMLRPCServer.pyo
9.85 KB
Rename
Delete
HTMLParser.py
16.77 KB
Rename
Delete
HTMLParser.pyc
13.41 KB
Rename
Delete
HTMLParser.pyo
13.11 KB
Rename
Delete
MimeWriter.py
6.33 KB
Rename
Delete
MimeWriter.pyc
7.19 KB
Rename
Delete
MimeWriter.pyo
7.19 KB
Rename
Delete
Queue.py
8.38 KB
Rename
Delete
Queue.pyc
9.20 KB
Rename
Delete
Queue.pyo
9.20 KB
Rename
Delete
SimpleHTTPServer.py
7.81 KB
Rename
Delete
SimpleHTTPServer.pyc
7.82 KB
Rename
Delete
SimpleHTTPServer.pyo
7.82 KB
Rename
Delete
SimpleXMLRPCServer.py
25.21 KB
Rename
Delete
SimpleXMLRPCServer.pyc
22.33 KB
Rename
Delete
SimpleXMLRPCServer.pyo
22.33 KB
Rename
Delete
SocketServer.py
23.39 KB
Rename
Delete
SocketServer.pyc
23.52 KB
Rename
Delete
SocketServer.pyo
23.52 KB
Rename
Delete
StringIO.py
10.41 KB
Rename
Delete
StringIO.pyc
11.21 KB
Rename
Delete
StringIO.pyo
11.21 KB
Rename
Delete
UserDict.py
6.89 KB
Rename
Delete
UserDict.pyc
9.48 KB
Rename
Delete
UserDict.pyo
9.48 KB
Rename
Delete
UserList.py
3.56 KB
Rename
Delete
UserList.pyc
6.42 KB
Rename
Delete
UserList.pyo
6.42 KB
Rename
Delete
UserString.py
9.46 KB
Rename
Delete
UserString.pyc
14.52 KB
Rename
Delete
UserString.pyo
14.52 KB
Rename
Delete
_LWPCookieJar.py
6.40 KB
Rename
Delete
_LWPCookieJar.pyc
5.31 KB
Rename
Delete
_LWPCookieJar.pyo
5.31 KB
Rename
Delete
_MozillaCookieJar.py
5.66 KB
Rename
Delete
_MozillaCookieJar.pyc
4.36 KB
Rename
Delete
_MozillaCookieJar.pyo
4.32 KB
Rename
Delete
__future__.py
4.28 KB
Rename
Delete
__future__.pyc
4.12 KB
Rename
Delete
__future__.pyo
4.12 KB
Rename
Delete
__phello__.foo.py
64 bytes
Rename
Delete
__phello__.foo.pyc
125 bytes
Rename
Delete
__phello__.foo.pyo
125 bytes
Rename
Delete
_abcoll.py
18.18 KB
Rename
Delete
_abcoll.pyc
25.08 KB
Rename
Delete
_abcoll.pyo
25.08 KB
Rename
Delete
_osx_support.py
18.65 KB
Rename
Delete
_osx_support.pyc
11.48 KB
Rename
Delete
_osx_support.pyo
11.48 KB
Rename
Delete
_pyio.py
68.00 KB
Rename
Delete
_pyio.pyc
63.18 KB
Rename
Delete
_pyio.pyo
63.18 KB
Rename
Delete
_strptime.py
20.24 KB
Rename
Delete
_strptime.pyc
14.82 KB
Rename
Delete
_strptime.pyo
14.82 KB
Rename
Delete
_sysconfigdata.py
19.27 KB
Rename
Delete
_sysconfigdata.pyc
22.43 KB
Rename
Delete
_sysconfigdata.pyo
22.43 KB
Rename
Delete
_threading_local.py
7.09 KB
Rename
Delete
_threading_local.pyc
6.22 KB
Rename
Delete
_threading_local.pyo
6.22 KB
Rename
Delete
_weakrefset.py
5.77 KB
Rename
Delete
_weakrefset.pyc
9.45 KB
Rename
Delete
_weakrefset.pyo
9.45 KB
Rename
Delete
abc.py
6.98 KB
Rename
Delete
abc.pyc
6.00 KB
Rename
Delete
abc.pyo
5.94 KB
Rename
Delete
aifc.py
33.77 KB
Rename
Delete
aifc.pyc
29.75 KB
Rename
Delete
aifc.pyo
29.75 KB
Rename
Delete
antigravity.py
60 bytes
Rename
Delete
antigravity.pyc
203 bytes
Rename
Delete
antigravity.pyo
203 bytes
Rename
Delete
anydbm.py
2.60 KB
Rename
Delete
anydbm.pyc
2.73 KB
Rename
Delete
anydbm.pyo
2.73 KB
Rename
Delete
argparse.py
87.14 KB
Rename
Delete
argparse.pyc
62.86 KB
Rename
Delete
argparse.pyo
62.70 KB
Rename
Delete
ast.py
11.53 KB
Rename
Delete
ast.pyc
12.63 KB
Rename
Delete
ast.pyo
12.63 KB
Rename
Delete
asynchat.py
11.31 KB
Rename
Delete
asynchat.pyc
8.60 KB
Rename
Delete
asynchat.pyo
8.60 KB
Rename
Delete
asyncore.py
20.45 KB
Rename
Delete
asyncore.pyc
18.45 KB
Rename
Delete
asyncore.pyo
18.45 KB
Rename
Delete
atexit.py
1.67 KB
Rename
Delete
atexit.pyc
2.15 KB
Rename
Delete
atexit.pyo
2.15 KB
Rename
Delete
audiodev.py
7.42 KB
Rename
Delete
audiodev.pyc
8.27 KB
Rename
Delete
audiodev.pyo
8.27 KB
Rename
Delete
base64.py
11.53 KB
Rename
Delete
base64.pyc
11.03 KB
Rename
Delete
base64.pyo
11.03 KB
Rename
Delete
bdb.py
21.21 KB
Rename
Delete
bdb.pyc
18.65 KB
Rename
Delete
bdb.pyo
18.65 KB
Rename
Delete
binhex.py
14.35 KB
Rename
Delete
binhex.pyc
15.10 KB
Rename
Delete
binhex.pyo
15.10 KB
Rename
Delete
bisect.py
2.53 KB
Rename
Delete
bisect.pyc
3.00 KB
Rename
Delete
bisect.pyo
3.00 KB
Rename
Delete
cProfile.py
6.42 KB
Rename
Delete
cProfile.pyc
6.25 KB
Rename
Delete
cProfile.pyo
6.25 KB
Rename
Delete
calendar.py
22.84 KB
Rename
Delete
calendar.pyc
27.26 KB
Rename
Delete
calendar.pyo
27.26 KB
Rename
Delete
cgi.py
35.46 KB
Rename
Delete
cgi.pyc
32.58 KB
Rename
Delete
cgi.pyo
32.58 KB
Rename
Delete
cgitb.py
11.89 KB
Rename
Delete
cgitb.pyc
11.85 KB
Rename
Delete
cgitb.pyo
11.85 KB
Rename
Delete
chunk.py
5.29 KB
Rename
Delete
chunk.pyc
5.47 KB
Rename
Delete
chunk.pyo
5.47 KB
Rename
Delete
cmd.py
14.67 KB
Rename
Delete
cmd.pyc
13.71 KB
Rename
Delete
cmd.pyo
13.71 KB
Rename
Delete
code.py
9.95 KB
Rename
Delete
code.pyc
10.09 KB
Rename
Delete
code.pyo
10.09 KB
Rename
Delete
codecs.py
35.30 KB
Rename
Delete
codecs.pyc
35.96 KB
Rename
Delete
codecs.pyo
35.96 KB
Rename
Delete
codeop.py
5.86 KB
Rename
Delete
codeop.pyc
6.44 KB
Rename
Delete
codeop.pyo
6.44 KB
Rename
Delete
collections.py
27.15 KB
Rename
Delete
collections.pyc
25.55 KB
Rename
Delete
collections.pyo
25.50 KB
Rename
Delete
colorsys.py
3.60 KB
Rename
Delete
colorsys.pyc
3.90 KB
Rename
Delete
colorsys.pyo
3.90 KB
Rename
Delete
commands.py
2.49 KB
Rename
Delete
commands.pyc
2.41 KB
Rename
Delete
commands.pyo
2.41 KB
Rename
Delete
compileall.py
7.58 KB
Rename
Delete
compileall.pyc
6.85 KB
Rename
Delete
compileall.pyo
6.85 KB
Rename
Delete
contextlib.py
4.32 KB
Rename
Delete
contextlib.pyc
4.35 KB
Rename
Delete
contextlib.pyo
4.35 KB
Rename
Delete
cookielib.py
63.95 KB
Rename
Delete
cookielib.pyc
53.44 KB
Rename
Delete
cookielib.pyo
53.26 KB
Rename
Delete
copy.py
11.26 KB
Rename
Delete
copy.pyc
11.88 KB
Rename
Delete
copy.pyo
11.79 KB
Rename
Delete
copy_reg.py
6.81 KB
Rename
Delete
copy_reg.pyc
5.05 KB
Rename
Delete
copy_reg.pyo
5.00 KB
Rename
Delete
crypt.py
2.24 KB
Rename
Delete
crypt.pyc
2.89 KB
Rename
Delete
crypt.pyo
2.89 KB
Rename
Delete
csv.py
16.32 KB
Rename
Delete
csv.pyc
13.19 KB
Rename
Delete
csv.pyo
13.19 KB
Rename
Delete
dbhash.py
498 bytes
Rename
Delete
dbhash.pyc
718 bytes
Rename
Delete
dbhash.pyo
718 bytes
Rename
Delete
decimal.py
216.73 KB
Rename
Delete
decimal.pyc
168.12 KB
Rename
Delete
decimal.pyo
168.12 KB
Rename
Delete
difflib.py
80.40 KB
Rename
Delete
difflib.pyc
60.45 KB
Rename
Delete
difflib.pyo
60.40 KB
Rename
Delete
dircache.py
1.10 KB
Rename
Delete
dircache.pyc
1.54 KB
Rename
Delete
dircache.pyo
1.54 KB
Rename
Delete
dis.py
6.35 KB
Rename
Delete
dis.pyc
6.08 KB
Rename
Delete
dis.pyo
6.08 KB
Rename
Delete
doctest.py
102.63 KB
Rename
Delete
doctest.pyc
81.68 KB
Rename
Delete
doctest.pyo
81.40 KB
Rename
Delete
dumbdbm.py
8.93 KB
Rename
Delete
dumbdbm.pyc
6.59 KB
Rename
Delete
dumbdbm.pyo
6.59 KB
Rename
Delete
dummy_thread.py
4.31 KB
Rename
Delete
dummy_thread.pyc
5.27 KB
Rename
Delete
dummy_thread.pyo
5.27 KB
Rename
Delete
dummy_threading.py
2.74 KB
Rename
Delete
dummy_threading.pyc
1.25 KB
Rename
Delete
dummy_threading.pyo
1.25 KB
Rename
Delete
filecmp.py
9.36 KB
Rename
Delete
filecmp.pyc
9.40 KB
Rename
Delete
filecmp.pyo
9.40 KB
Rename
Delete
fileinput.py
13.42 KB
Rename
Delete
fileinput.pyc
14.16 KB
Rename
Delete
fileinput.pyo
14.16 KB
Rename
Delete
fnmatch.py
3.24 KB
Rename
Delete
fnmatch.pyc
3.53 KB
Rename
Delete
fnmatch.pyo
3.53 KB
Rename
Delete
formatter.py
14.56 KB
Rename
Delete
formatter.pyc
18.73 KB
Rename
Delete
formatter.pyo
18.73 KB
Rename
Delete
fpformat.py
4.62 KB
Rename
Delete
fpformat.pyc
4.59 KB
Rename
Delete
fpformat.pyo
4.59 KB
Rename
Delete
fractions.py
21.87 KB
Rename
Delete
fractions.pyc
19.25 KB
Rename
Delete
fractions.pyo
19.25 KB
Rename
Delete
ftplib.py
37.65 KB
Rename
Delete
ftplib.pyc
34.12 KB
Rename
Delete
ftplib.pyo
34.12 KB
Rename
Delete
functools.py
4.69 KB
Rename
Delete
functools.pyc
6.47 KB
Rename
Delete
functools.pyo
6.47 KB
Rename
Delete
genericpath.py
3.13 KB
Rename
Delete
genericpath.pyc
3.43 KB
Rename
Delete
genericpath.pyo
3.43 KB
Rename
Delete
getopt.py
7.15 KB
Rename
Delete
getopt.pyc
6.50 KB
Rename
Delete
getopt.pyo
6.45 KB
Rename
Delete
getpass.py
5.43 KB
Rename
Delete
getpass.pyc
4.63 KB
Rename
Delete
getpass.pyo
4.63 KB
Rename
Delete
gettext.py
22.13 KB
Rename
Delete
gettext.pyc
17.58 KB
Rename
Delete
gettext.pyo
17.58 KB
Rename
Delete
glob.py
3.04 KB
Rename
Delete
glob.pyc
2.87 KB
Rename
Delete
glob.pyo
2.87 KB
Rename
Delete
gzip.py
18.58 KB
Rename
Delete
gzip.pyc
14.88 KB
Rename
Delete
gzip.pyo
14.88 KB
Rename
Delete
hashlib.py
7.66 KB
Rename
Delete
hashlib.pyc
6.76 KB
Rename
Delete
hashlib.pyo
6.76 KB
Rename
Delete
heapq.py
17.87 KB
Rename
Delete
heapq.pyc
14.22 KB
Rename
Delete
heapq.pyo
14.22 KB
Rename
Delete
hmac.py
4.48 KB
Rename
Delete
hmac.pyc
4.44 KB
Rename
Delete
hmac.pyo
4.44 KB
Rename
Delete
htmlentitydefs.py
17.63 KB
Rename
Delete
htmlentitydefs.pyc
6.22 KB
Rename
Delete
htmlentitydefs.pyo
6.22 KB
Rename
Delete
htmllib.py
12.57 KB
Rename
Delete
htmllib.pyc
19.83 KB
Rename
Delete
htmllib.pyo
19.83 KB
Rename
Delete
httplib.py
52.06 KB
Rename
Delete
httplib.pyc
37.82 KB
Rename
Delete
httplib.pyo
37.64 KB
Rename
Delete
ihooks.py
18.54 KB
Rename
Delete
ihooks.pyc
20.87 KB
Rename
Delete
ihooks.pyo
20.87 KB
Rename
Delete
imaplib.py
47.23 KB
Rename
Delete
imaplib.pyc
43.96 KB
Rename
Delete
imaplib.pyo
41.32 KB
Rename
Delete
imghdr.py
3.46 KB
Rename
Delete
imghdr.pyc
4.72 KB
Rename
Delete
imghdr.pyo
4.72 KB
Rename
Delete
imputil.py
25.16 KB
Rename
Delete
imputil.pyc
15.26 KB
Rename
Delete
imputil.pyo
15.08 KB
Rename
Delete
inspect.py
42.00 KB
Rename
Delete
inspect.pyc
39.29 KB
Rename
Delete
inspect.pyo
39.29 KB
Rename
Delete
io.py
3.24 KB
Rename
Delete
io.pyc
3.50 KB
Rename
Delete
io.pyo
3.50 KB
Rename
Delete
keyword.py
1.95 KB
Rename
Delete
keyword.pyc
2.06 KB
Rename
Delete
keyword.pyo
2.06 KB
Rename
Delete
linecache.py
3.93 KB
Rename
Delete
linecache.pyc
3.20 KB
Rename
Delete
linecache.pyo
3.20 KB
Rename
Delete
locale.py
100.42 KB
Rename
Delete
locale.pyc
55.28 KB
Rename
Delete
locale.pyo
55.28 KB
Rename
Delete
macpath.py
6.14 KB
Rename
Delete
macpath.pyc
7.50 KB
Rename
Delete
macpath.pyo
7.50 KB
Rename
Delete
macurl2path.py
2.67 KB
Rename
Delete
macurl2path.pyc
2.19 KB
Rename
Delete
macurl2path.pyo
2.19 KB
Rename
Delete
mailbox.py
79.34 KB
Rename
Delete
mailbox.pyc
74.92 KB
Rename
Delete
mailbox.pyo
74.87 KB
Rename
Delete
mailcap.py
8.21 KB
Rename
Delete
mailcap.pyc
7.77 KB
Rename
Delete
mailcap.pyo
7.77 KB
Rename
Delete
markupbase.py
14.30 KB
Rename
Delete
markupbase.pyc
9.05 KB
Rename
Delete
markupbase.pyo
8.86 KB
Rename
Delete
md5.py
358 bytes
Rename
Delete
md5.pyc
378 bytes
Rename
Delete
md5.pyo
378 bytes
Rename
Delete
mhlib.py
32.65 KB
Rename
Delete
mhlib.pyc
32.99 KB
Rename
Delete
mhlib.pyo
32.99 KB
Rename
Delete
mimetools.py
7.00 KB
Rename
Delete
mimetools.pyc
8.01 KB
Rename
Delete
mimetools.pyo
8.01 KB
Rename
Delete
mimetypes.py
20.54 KB
Rename
Delete
mimetypes.pyc
18.06 KB
Rename
Delete
mimetypes.pyo
18.06 KB
Rename
Delete
mimify.py
14.67 KB
Rename
Delete
mimify.pyc
11.72 KB
Rename
Delete
mimify.pyo
11.72 KB
Rename
Delete
modulefinder.py
23.89 KB
Rename
Delete
modulefinder.pyc
18.68 KB
Rename
Delete
modulefinder.pyo
18.60 KB
Rename
Delete
multifile.py
4.71 KB
Rename
Delete
multifile.pyc
5.29 KB
Rename
Delete
multifile.pyo
5.25 KB
Rename
Delete
mutex.py
1.83 KB
Rename
Delete
mutex.pyc
2.46 KB
Rename
Delete
mutex.pyo
2.46 KB
Rename
Delete
netrc.py
5.75 KB
Rename
Delete
netrc.pyc
4.60 KB
Rename
Delete
netrc.pyo
4.60 KB
Rename
Delete
new.py
610 bytes
Rename
Delete
new.pyc
862 bytes
Rename
Delete
new.pyo
862 bytes
Rename
Delete
nntplib.py
20.97 KB
Rename
Delete
nntplib.pyc
20.55 KB
Rename
Delete
nntplib.pyo
20.55 KB
Rename
Delete
ntpath.py
18.97 KB
Rename
Delete
ntpath.pyc
12.82 KB
Rename
Delete
ntpath.pyo
12.82 KB
Rename
Delete
nturl2path.py
2.36 KB
Rename
Delete
nturl2path.pyc
1.77 KB
Rename
Delete
nturl2path.pyo
1.77 KB
Rename
Delete
numbers.py
10.08 KB
Rename
Delete
numbers.pyc
13.68 KB
Rename
Delete
numbers.pyo
13.68 KB
Rename
Delete
opcode.py
5.35 KB
Rename
Delete
opcode.pyc
6.00 KB
Rename
Delete
opcode.pyo
6.00 KB
Rename
Delete
optparse.py
59.77 KB
Rename
Delete
optparse.pyc
52.63 KB
Rename
Delete
optparse.pyo
52.55 KB
Rename
Delete
os.py
25.30 KB
Rename
Delete
os.pyc
25.09 KB
Rename
Delete
os.pyo
25.09 KB
Rename
Delete
os2emxpath.py
4.53 KB
Rename
Delete
os2emxpath.pyc
4.42 KB
Rename
Delete
os2emxpath.pyo
4.42 KB
Rename
Delete
pdb.doc
7.73 KB
Rename
Delete
pdb.py
45.02 KB
Rename
Delete
pdb.pyc
42.65 KB
Rename
Delete
pdb.pyo
42.65 KB
Rename
Delete
pickle.py
44.42 KB
Rename
Delete
pickle.pyc
37.66 KB
Rename
Delete
pickle.pyo
37.46 KB
Rename
Delete
pickletools.py
72.78 KB
Rename
Delete
pickletools.pyc
55.70 KB
Rename
Delete
pickletools.pyo
54.85 KB
Rename
Delete
pipes.py
9.36 KB
Rename
Delete
pipes.pyc
9.09 KB
Rename
Delete
pipes.pyo
9.09 KB
Rename
Delete
pkgutil.py
19.77 KB
Rename
Delete
pkgutil.pyc
18.51 KB
Rename
Delete
pkgutil.pyo
18.51 KB
Rename
Delete
platform.py
51.56 KB
Rename
Delete
platform.pyc
37.08 KB
Rename
Delete
platform.pyo
37.08 KB
Rename
Delete
plistlib.py
15.44 KB
Rename
Delete
plistlib.pyc
19.50 KB
Rename
Delete
plistlib.pyo
19.41 KB
Rename
Delete
popen2.py
8.22 KB
Rename
Delete
popen2.pyc
8.81 KB
Rename
Delete
popen2.pyo
8.77 KB
Rename
Delete
poplib.py
12.52 KB
Rename
Delete
poplib.pyc
13.03 KB
Rename
Delete
poplib.pyo
13.03 KB
Rename
Delete
posixfile.py
7.82 KB
Rename
Delete
posixfile.pyc
7.47 KB
Rename
Delete
posixfile.pyo
7.47 KB
Rename
Delete
posixpath.py
13.96 KB
Rename
Delete
posixpath.pyc
11.19 KB
Rename
Delete
posixpath.pyo
11.19 KB
Rename
Delete
pprint.py
11.50 KB
Rename
Delete
pprint.pyc
9.96 KB
Rename
Delete
pprint.pyo
9.78 KB
Rename
Delete
profile.py
22.25 KB
Rename
Delete
profile.pyc
16.07 KB
Rename
Delete
profile.pyo
15.83 KB
Rename
Delete
pstats.py
26.09 KB
Rename
Delete
pstats.pyc
24.43 KB
Rename
Delete
pstats.pyo
24.43 KB
Rename
Delete
pty.py
4.94 KB
Rename
Delete
pty.pyc
4.85 KB
Rename
Delete
pty.pyo
4.85 KB
Rename
Delete
py_compile.py
5.80 KB
Rename
Delete
py_compile.pyc
6.28 KB
Rename
Delete
py_compile.pyo
6.28 KB
Rename
Delete
pyclbr.py
13.07 KB
Rename
Delete
pyclbr.pyc
9.42 KB
Rename
Delete
pyclbr.pyo
9.42 KB
Rename
Delete
pydoc.py
93.50 KB
Rename
Delete
pydoc.pyc
90.18 KB
Rename
Delete
pydoc.pyo
90.12 KB
Rename
Delete
quopri.py
6.80 KB
Rename
Delete
quopri.pyc
6.42 KB
Rename
Delete
quopri.pyo
6.42 KB
Rename
Delete
random.py
31.70 KB
Rename
Delete
random.pyc
25.10 KB
Rename
Delete
random.pyo
25.10 KB
Rename
Delete
re.py
13.11 KB
Rename
Delete
re.pyc
13.10 KB
Rename
Delete
re.pyo
13.10 KB
Rename
Delete
repr.py
4.20 KB
Rename
Delete
repr.pyc
5.26 KB
Rename
Delete
repr.pyo
5.26 KB
Rename
Delete
rexec.py
19.68 KB
Rename
Delete
rexec.pyc
23.25 KB
Rename
Delete
rexec.pyo
23.25 KB
Rename
Delete
rfc822.py
32.76 KB
Rename
Delete
rfc822.pyc
31.07 KB
Rename
Delete
rfc822.pyo
31.07 KB
Rename
Delete
rlcompleter.py
5.85 KB
Rename
Delete
rlcompleter.pyc
5.94 KB
Rename
Delete
rlcompleter.pyo
5.94 KB
Rename
Delete
robotparser.py
7.51 KB
Rename
Delete
robotparser.pyc
7.82 KB
Rename
Delete
robotparser.pyo
7.82 KB
Rename
Delete
runpy.py
10.82 KB
Rename
Delete
runpy.pyc
8.60 KB
Rename
Delete
runpy.pyo
8.60 KB
Rename
Delete
sched.py
4.97 KB
Rename
Delete
sched.pyc
4.88 KB
Rename
Delete
sched.pyo
4.88 KB
Rename
Delete
sets.py
18.60 KB
Rename
Delete
sets.pyc
16.50 KB
Rename
Delete
sets.pyo
16.50 KB
Rename
Delete
sgmllib.py
17.46 KB
Rename
Delete
sgmllib.pyc
15.07 KB
Rename
Delete
sgmllib.pyo
15.07 KB
Rename
Delete
sha.py
393 bytes
Rename
Delete
sha.pyc
421 bytes
Rename
Delete
sha.pyo
421 bytes
Rename
Delete
shelve.py
7.99 KB
Rename
Delete
shelve.pyc
10.02 KB
Rename
Delete
shelve.pyo
10.02 KB
Rename
Delete
shlex.py
10.90 KB
Rename
Delete
shlex.pyc
7.38 KB
Rename
Delete
shlex.pyo
7.38 KB
Rename
Delete
shutil.py
19.41 KB
Rename
Delete
shutil.pyc
18.81 KB
Rename
Delete
shutil.pyo
18.81 KB
Rename
Delete
site.py
20.80 KB
Rename
Delete
site.pyc
20.30 KB
Rename
Delete
site.pyo
20.30 KB
Rename
Delete
smtpd.py
18.11 KB
Rename
Delete
smtpd.pyc
15.51 KB
Rename
Delete
smtpd.pyo
15.51 KB
Rename
Delete
smtplib.py
31.38 KB
Rename
Delete
smtplib.pyc
29.59 KB
Rename
Delete
smtplib.pyo
29.59 KB
Rename
Delete
sndhdr.py
5.83 KB
Rename
Delete
sndhdr.pyc
7.19 KB
Rename
Delete
sndhdr.pyo
7.19 KB
Rename
Delete
socket.py
20.13 KB
Rename
Delete
socket.pyc
15.77 KB
Rename
Delete
socket.pyo
15.69 KB
Rename
Delete
sre.py
384 bytes
Rename
Delete
sre.pyc
519 bytes
Rename
Delete
sre.pyo
519 bytes
Rename
Delete
sre_compile.py
19.36 KB
Rename
Delete
sre_compile.pyc
12.27 KB
Rename
Delete
sre_compile.pyo
12.11 KB
Rename
Delete
sre_constants.py
7.03 KB
Rename
Delete
sre_constants.pyc
6.05 KB
Rename
Delete
sre_constants.pyo
6.05 KB
Rename
Delete
sre_parse.py
29.98 KB
Rename
Delete
sre_parse.pyc
20.66 KB
Rename
Delete
sre_parse.pyo
20.66 KB
Rename
Delete
ssl.py
38.39 KB
Rename
Delete
ssl.pyc
31.95 KB
Rename
Delete
ssl.pyo
31.95 KB
Rename
Delete
stat.py
1.80 KB
Rename
Delete
stat.pyc
2.69 KB
Rename
Delete
stat.pyo
2.69 KB
Rename
Delete
statvfs.py
898 bytes
Rename
Delete
statvfs.pyc
620 bytes
Rename
Delete
statvfs.pyo
620 bytes
Rename
Delete
string.py
21.04 KB
Rename
Delete
string.pyc
19.98 KB
Rename
Delete
string.pyo
19.98 KB
Rename
Delete
stringold.py
12.16 KB
Rename
Delete
stringold.pyc
12.25 KB
Rename
Delete
stringold.pyo
12.25 KB
Rename
Delete
stringprep.py
13.21 KB
Rename
Delete
stringprep.pyc
14.15 KB
Rename
Delete
stringprep.pyo
14.08 KB
Rename
Delete
struct.py
82 bytes
Rename
Delete
struct.pyc
239 bytes
Rename
Delete
struct.pyo
239 bytes
Rename
Delete
subprocess.py
49.34 KB
Rename
Delete
subprocess.pyc
31.64 KB
Rename
Delete
subprocess.pyo
31.64 KB
Rename
Delete
sunau.py
16.82 KB
Rename
Delete
sunau.pyc
17.96 KB
Rename
Delete
sunau.pyo
17.96 KB
Rename
Delete
sunaudio.py
1.37 KB
Rename
Delete
sunaudio.pyc
1.94 KB
Rename
Delete
sunaudio.pyo
1.94 KB
Rename
Delete
symbol.py
2.01 KB
Rename
Delete
symbol.pyc
2.96 KB
Rename
Delete
symbol.pyo
2.96 KB
Rename
Delete
symtable.py
7.26 KB
Rename
Delete
symtable.pyc
11.51 KB
Rename
Delete
symtable.pyo
11.38 KB
Rename
Delete
sysconfig.py
22.32 KB
Rename
Delete
sysconfig.pyc
17.40 KB
Rename
Delete
sysconfig.pyo
17.40 KB
Rename
Delete
tabnanny.py
11.07 KB
Rename
Delete
tabnanny.pyc
8.05 KB
Rename
Delete
tabnanny.pyo
8.05 KB
Rename
Delete
tarfile.py
88.53 KB
Rename
Delete
tarfile.pyc
74.41 KB
Rename
Delete
tarfile.pyo
74.41 KB
Rename
Delete
telnetlib.py
26.40 KB
Rename
Delete
telnetlib.pyc
22.61 KB
Rename
Delete
telnetlib.pyo
22.61 KB
Rename
Delete
tempfile.py
19.09 KB
Rename
Delete
tempfile.pyc
19.87 KB
Rename
Delete
tempfile.pyo
19.87 KB
Rename
Delete
textwrap.py
16.88 KB
Rename
Delete
textwrap.pyc
11.81 KB
Rename
Delete
textwrap.pyo
11.72 KB
Rename
Delete
this.py
1002 bytes
Rename
Delete
this.pyc
1.19 KB
Rename
Delete
this.pyo
1.19 KB
Rename
Delete
threading.py
46.27 KB
Rename
Delete
threading.pyc
41.72 KB
Rename
Delete
threading.pyo
39.60 KB
Rename
Delete
timeit.py
12.49 KB
Rename
Delete
timeit.pyc
11.90 KB
Rename
Delete
timeit.pyo
11.90 KB
Rename
Delete
toaiff.py
3.07 KB
Rename
Delete
toaiff.pyc
3.03 KB
Rename
Delete
toaiff.pyo
3.03 KB
Rename
Delete
token.py
2.85 KB
Rename
Delete
token.pyc
3.73 KB
Rename
Delete
token.pyo
3.73 KB
Rename
Delete
tokenize.py
17.07 KB
Rename
Delete
tokenize.pyc
14.17 KB
Rename
Delete
tokenize.pyo
14.11 KB
Rename
Delete
trace.py
29.19 KB
Rename
Delete
trace.pyc
22.26 KB
Rename
Delete
trace.pyo
22.20 KB
Rename
Delete
traceback.py
11.02 KB
Rename
Delete
traceback.pyc
11.41 KB
Rename
Delete
traceback.pyo
11.41 KB
Rename
Delete
tty.py
879 bytes
Rename
Delete
tty.pyc
1.29 KB
Rename
Delete
tty.pyo
1.29 KB
Rename
Delete
types.py
2.04 KB
Rename
Delete
types.pyc
2.66 KB
Rename
Delete
types.pyo
2.66 KB
Rename
Delete
urllib.py
58.82 KB
Rename
Delete
urllib.pyc
50.04 KB
Rename
Delete
urllib.pyo
49.95 KB
Rename
Delete
urllib2.py
51.31 KB
Rename
Delete
urllib2.pyc
46.19 KB
Rename
Delete
urllib2.pyo
46.10 KB
Rename
Delete
urlparse.py
19.98 KB
Rename
Delete
urlparse.pyc
17.59 KB
Rename
Delete
urlparse.pyo
17.59 KB
Rename
Delete
user.py
1.59 KB
Rename
Delete
user.pyc
1.68 KB
Rename
Delete
user.pyo
1.68 KB
Rename
Delete
uu.py
6.54 KB
Rename
Delete
uu.pyc
4.29 KB
Rename
Delete
uu.pyo
4.29 KB
Rename
Delete
uuid.py
22.98 KB
Rename
Delete
uuid.pyc
22.82 KB
Rename
Delete
uuid.pyo
22.71 KB
Rename
Delete
warnings.py
14.48 KB
Rename
Delete
warnings.pyc
13.19 KB
Rename
Delete
warnings.pyo
12.42 KB
Rename
Delete
wave.py
18.15 KB
Rename
Delete
wave.pyc
19.54 KB
Rename
Delete
wave.pyo
19.40 KB
Rename
Delete
weakref.py
14.48 KB
Rename
Delete
weakref.pyc
16.06 KB
Rename
Delete
weakref.pyo
16.06 KB
Rename
Delete
webbrowser.py
22.19 KB
Rename
Delete
webbrowser.pyc
19.29 KB
Rename
Delete
webbrowser.pyo
19.24 KB
Rename
Delete
whichdb.py
3.30 KB
Rename
Delete
whichdb.pyc
2.19 KB
Rename
Delete
whichdb.pyo
2.19 KB
Rename
Delete
wsgiref.egg-info
187 bytes
Rename
Delete
xdrlib.py
5.93 KB
Rename
Delete
xdrlib.pyc
9.67 KB
Rename
Delete
xdrlib.pyo
9.67 KB
Rename
Delete
xmllib.py
34.05 KB
Rename
Delete
xmllib.pyc
26.22 KB
Rename
Delete
xmllib.pyo
26.22 KB
Rename
Delete
xmlrpclib.py
50.91 KB
Rename
Delete
xmlrpclib.pyc
43.07 KB
Rename
Delete
xmlrpclib.pyo
42.89 KB
Rename
Delete
zipfile.py
58.08 KB
Rename
Delete
zipfile.pyc
41.15 KB
Rename
Delete
zipfile.pyo
41.15 KB
Rename
Delete
"""Internationalization and localization support. This module provides internationalization (I18N) and localization (L10N) support for your Python programs by providing an interface to the GNU gettext message catalog library. I18N refers to the operation by which a program is made aware of multiple languages. L10N refers to the adaptation of your program, once internationalized, to the local language and cultural habits. """ # This module represents the integration of work, contributions, feedback, and # suggestions from the following people: # # Martin von Loewis, who wrote the initial implementation of the underlying # C-based libintlmodule (later renamed _gettext), along with a skeletal # gettext.py implementation. # # Peter Funk, who wrote fintl.py, a fairly complete wrapper around intlmodule, # which also included a pure-Python implementation to read .mo files if # intlmodule wasn't available. # # James Henstridge, who also wrote a gettext.py module, which has some # interesting, but currently unsupported experimental features: the notion of # a Catalog class and instances, and the ability to add to a catalog file via # a Python API. # # Barry Warsaw integrated these modules, wrote the .install() API and code, # and conformed all C and Python code to Python's coding standards. # # Francois Pinard and Marc-Andre Lemburg also contributed valuably to this # module. # # J. David Ibanez implemented plural forms. Bruno Haible fixed some bugs. # # TODO: # - Lazy loading of .mo files. Currently the entire catalog is loaded into # memory, but that's probably bad for large translated programs. Instead, # the lexical sort of original strings in GNU .mo files should be exploited # to do binary searches and lazy initializations. Or you might want to use # the undocumented double-hash algorithm for .mo files with hash tables, but # you'll need to study the GNU gettext code to do this. # # - Support Solaris .mo file formats. Unfortunately, we've been unable to # find this format documented anywhere. import locale, copy, os, re, struct, sys from errno import ENOENT __all__ = ['NullTranslations', 'GNUTranslations', 'Catalog', 'find', 'translation', 'install', 'textdomain', 'bindtextdomain', 'bind_textdomain_codeset', 'dgettext', 'dngettext', 'gettext', 'lgettext', 'ldgettext', 'ldngettext', 'lngettext', 'ngettext', ] _default_localedir = os.path.join(sys.prefix, 'share', 'locale') # Expression parsing for plural form selection. # # The gettext library supports a small subset of C syntax. The only # incompatible difference is that integer literals starting with zero are # decimal. # # https://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms # http://git.savannah.gnu.org/cgit/gettext.git/tree/gettext-runtime/intl/plural.y _token_pattern = re.compile(r""" (?P<WHITESPACES>[ \t]+) | # spaces and horizontal tabs (?P<NUMBER>[0-9]+\b) | # decimal integer (?P<NAME>n\b) | # only n is allowed (?P<PARENTHESIS>[()]) | (?P<OPERATOR>[-*/%+?:]|[><!]=?|==|&&|\|\|) | # !, *, /, %, +, -, <, >, # <=, >=, ==, !=, &&, ||, # ? : # unary and bitwise ops # not allowed (?P<INVALID>\w+|.) # invalid token """, re.VERBOSE|re.DOTALL) def _tokenize(plural): for mo in re.finditer(_token_pattern, plural): kind = mo.lastgroup if kind == 'WHITESPACES': continue value = mo.group(kind) if kind == 'INVALID': raise ValueError('invalid token in plural form: %s' % value) yield value yield '' def _error(value): if value: return ValueError('unexpected token in plural form: %s' % value) else: return ValueError('unexpected end of plural form') _binary_ops = ( ('||',), ('&&',), ('==', '!='), ('<', '>', '<=', '>='), ('+', '-'), ('*', '/', '%'), ) _binary_ops = {op: i for i, ops in enumerate(_binary_ops, 1) for op in ops} _c2py_ops = {'||': 'or', '&&': 'and', '/': '//'} def _parse(tokens, priority=-1): result = '' nexttok = next(tokens) while nexttok == '!': result += 'not ' nexttok = next(tokens) if nexttok == '(': sub, nexttok = _parse(tokens) result = '%s(%s)' % (result, sub) if nexttok != ')': raise ValueError('unbalanced parenthesis in plural form') elif nexttok == 'n': result = '%s%s' % (result, nexttok) else: try: value = int(nexttok, 10) except ValueError: raise _error(nexttok) result = '%s%d' % (result, value) nexttok = next(tokens) j = 100 while nexttok in _binary_ops: i = _binary_ops[nexttok] if i < priority: break # Break chained comparisons if i in (3, 4) and j in (3, 4): # '==', '!=', '<', '>', '<=', '>=' result = '(%s)' % result # Replace some C operators by their Python equivalents op = _c2py_ops.get(nexttok, nexttok) right, nexttok = _parse(tokens, i + 1) result = '%s %s %s' % (result, op, right) j = i if j == priority == 4: # '<', '>', '<=', '>=' result = '(%s)' % result if nexttok == '?' and priority <= 0: if_true, nexttok = _parse(tokens, 0) if nexttok != ':': raise _error(nexttok) if_false, nexttok = _parse(tokens) result = '%s if %s else %s' % (if_true, result, if_false) if priority == 0: result = '(%s)' % result return result, nexttok def _as_int(n): try: i = round(n) except TypeError: raise TypeError('Plural value must be an integer, got %s' % (n.__class__.__name__,)) return n def c2py(plural): """Gets a C expression as used in PO files for plural forms and returns a Python function that implements an equivalent expression. """ if len(plural) > 1000: raise ValueError('plural form expression is too long') try: result, nexttok = _parse(_tokenize(plural)) if nexttok: raise _error(nexttok) depth = 0 for c in result: if c == '(': depth += 1 if depth > 20: # Python compiler limit is about 90. # The most complex example has 2. raise ValueError('plural form expression is too complex') elif c == ')': depth -= 1 ns = {'_as_int': _as_int} exec('''if 1: def func(n): if not isinstance(n, int): n = _as_int(n) return int(%s) ''' % result, ns) return ns['func'] except RuntimeError: # Recursion error can be raised in _parse() or exec(). raise ValueError('plural form expression is too complex') def _expand_lang(locale): from locale import normalize locale = normalize(locale) COMPONENT_CODESET = 1 << 0 COMPONENT_TERRITORY = 1 << 1 COMPONENT_MODIFIER = 1 << 2 # split up the locale into its base components mask = 0 pos = locale.find('@') if pos >= 0: modifier = locale[pos:] locale = locale[:pos] mask |= COMPONENT_MODIFIER else: modifier = '' pos = locale.find('.') if pos >= 0: codeset = locale[pos:] locale = locale[:pos] mask |= COMPONENT_CODESET else: codeset = '' pos = locale.find('_') if pos >= 0: territory = locale[pos:] locale = locale[:pos] mask |= COMPONENT_TERRITORY else: territory = '' language = locale ret = [] for i in range(mask+1): if not (i & ~mask): # if all components for this combo exist ... val = language if i & COMPONENT_TERRITORY: val += territory if i & COMPONENT_CODESET: val += codeset if i & COMPONENT_MODIFIER: val += modifier ret.append(val) ret.reverse() return ret class NullTranslations: def __init__(self, fp=None): self._info = {} self._charset = None self._output_charset = None self._fallback = None if fp is not None: self._parse(fp) def _parse(self, fp): pass def add_fallback(self, fallback): if self._fallback: self._fallback.add_fallback(fallback) else: self._fallback = fallback def gettext(self, message): if self._fallback: return self._fallback.gettext(message) return message def lgettext(self, message): if self._fallback: return self._fallback.lgettext(message) return message def ngettext(self, msgid1, msgid2, n): if self._fallback: return self._fallback.ngettext(msgid1, msgid2, n) if n == 1: return msgid1 else: return msgid2 def lngettext(self, msgid1, msgid2, n): if self._fallback: return self._fallback.lngettext(msgid1, msgid2, n) if n == 1: return msgid1 else: return msgid2 def ugettext(self, message): if self._fallback: return self._fallback.ugettext(message) return unicode(message) def ungettext(self, msgid1, msgid2, n): if self._fallback: return self._fallback.ungettext(msgid1, msgid2, n) if n == 1: return unicode(msgid1) else: return unicode(msgid2) def info(self): return self._info def charset(self): return self._charset def output_charset(self): return self._output_charset def set_output_charset(self, charset): self._output_charset = charset def install(self, unicode=False, names=None): import __builtin__ __builtin__.__dict__['_'] = unicode and self.ugettext or self.gettext if hasattr(names, "__contains__"): if "gettext" in names: __builtin__.__dict__['gettext'] = __builtin__.__dict__['_'] if "ngettext" in names: __builtin__.__dict__['ngettext'] = (unicode and self.ungettext or self.ngettext) if "lgettext" in names: __builtin__.__dict__['lgettext'] = self.lgettext if "lngettext" in names: __builtin__.__dict__['lngettext'] = self.lngettext class GNUTranslations(NullTranslations): # Magic number of .mo files LE_MAGIC = 0x950412deL BE_MAGIC = 0xde120495L def _parse(self, fp): """Override this method to support alternative .mo formats.""" unpack = struct.unpack filename = getattr(fp, 'name', '') # Parse the .mo file header, which consists of 5 little endian 32 # bit words. self._catalog = catalog = {} self.plural = lambda n: int(n != 1) # germanic plural by default buf = fp.read() buflen = len(buf) # Are we big endian or little endian? magic = unpack('<I', buf[:4])[0] if magic == self.LE_MAGIC: version, msgcount, masteridx, transidx = unpack('<4I', buf[4:20]) ii = '<II' elif magic == self.BE_MAGIC: version, msgcount, masteridx, transidx = unpack('>4I', buf[4:20]) ii = '>II' else: raise IOError(0, 'Bad magic number', filename) # Now put all messages from the .mo file buffer into the catalog # dictionary. for i in xrange(0, msgcount): mlen, moff = unpack(ii, buf[masteridx:masteridx+8]) mend = moff + mlen tlen, toff = unpack(ii, buf[transidx:transidx+8]) tend = toff + tlen if mend < buflen and tend < buflen: msg = buf[moff:mend] tmsg = buf[toff:tend] else: raise IOError(0, 'File is corrupt', filename) # See if we're looking at GNU .mo conventions for metadata if mlen == 0: # Catalog description lastk = None for item in tmsg.splitlines(): item = item.strip() if not item: continue if item.startswith("#"): continue k = v = None if ':' in item: k, v = item.split(':', 1) k = k.strip().lower() v = v.strip() self._info[k] = v lastk = k elif lastk: self._info[lastk] += '\n' + item if k == 'content-type': self._charset = v.split('charset=')[1] elif k == 'plural-forms': v = v.split(';') plural = v[1].split('plural=')[1] self.plural = c2py(plural) # Note: we unconditionally convert both msgids and msgstrs to # Unicode using the character encoding specified in the charset # parameter of the Content-Type header. The gettext documentation # strongly encourages msgids to be us-ascii, but some applications # require alternative encodings (e.g. Zope's ZCML and ZPT). For # traditional gettext applications, the msgid conversion will # cause no problems since us-ascii should always be a subset of # the charset encoding. We may want to fall back to 8-bit msgids # if the Unicode conversion fails. if '\x00' in msg: # Plural forms msgid1, msgid2 = msg.split('\x00') tmsg = tmsg.split('\x00') if self._charset: msgid1 = unicode(msgid1, self._charset) tmsg = [unicode(x, self._charset) for x in tmsg] for i in range(len(tmsg)): catalog[(msgid1, i)] = tmsg[i] else: if self._charset: msg = unicode(msg, self._charset) tmsg = unicode(tmsg, self._charset) catalog[msg] = tmsg # advance to next entry in the seek tables masteridx += 8 transidx += 8 def gettext(self, message): missing = object() tmsg = self._catalog.get(message, missing) if tmsg is missing: if self._fallback: return self._fallback.gettext(message) return message # Encode the Unicode tmsg back to an 8-bit string, if possible if self._output_charset: return tmsg.encode(self._output_charset) elif self._charset: return tmsg.encode(self._charset) return tmsg def lgettext(self, message): missing = object() tmsg = self._catalog.get(message, missing) if tmsg is missing: if self._fallback: return self._fallback.lgettext(message) return message if self._output_charset: return tmsg.encode(self._output_charset) return tmsg.encode(locale.getpreferredencoding()) def ngettext(self, msgid1, msgid2, n): try: tmsg = self._catalog[(msgid1, self.plural(n))] if self._output_charset: return tmsg.encode(self._output_charset) elif self._charset: return tmsg.encode(self._charset) return tmsg except KeyError: if self._fallback: return self._fallback.ngettext(msgid1, msgid2, n) if n == 1: return msgid1 else: return msgid2 def lngettext(self, msgid1, msgid2, n): try: tmsg = self._catalog[(msgid1, self.plural(n))] if self._output_charset: return tmsg.encode(self._output_charset) return tmsg.encode(locale.getpreferredencoding()) except KeyError: if self._fallback: return self._fallback.lngettext(msgid1, msgid2, n) if n == 1: return msgid1 else: return msgid2 def ugettext(self, message): missing = object() tmsg = self._catalog.get(message, missing) if tmsg is missing: if self._fallback: return self._fallback.ugettext(message) return unicode(message) return tmsg def ungettext(self, msgid1, msgid2, n): try: tmsg = self._catalog[(msgid1, self.plural(n))] except KeyError: if self._fallback: return self._fallback.ungettext(msgid1, msgid2, n) if n == 1: tmsg = unicode(msgid1) else: tmsg = unicode(msgid2) return tmsg # Locate a .mo file using the gettext strategy def find(domain, localedir=None, languages=None, all=0): # Get some reasonable defaults for arguments that were not supplied if localedir is None: localedir = _default_localedir if languages is None: languages = [] for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'): val = os.environ.get(envar) if val: languages = val.split(':') break if 'C' not in languages: languages.append('C') # now normalize and expand the languages nelangs = [] for lang in languages: for nelang in _expand_lang(lang): if nelang not in nelangs: nelangs.append(nelang) # select a language if all: result = [] else: result = None for lang in nelangs: if lang == 'C': break mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain) if os.path.exists(mofile): if all: result.append(mofile) else: return mofile return result # a mapping between absolute .mo file path and Translation object _translations = {} def translation(domain, localedir=None, languages=None, class_=None, fallback=False, codeset=None): if class_ is None: class_ = GNUTranslations mofiles = find(domain, localedir, languages, all=1) if not mofiles: if fallback: return NullTranslations() raise IOError(ENOENT, 'No translation file found for domain', domain) # Avoid opening, reading, and parsing the .mo file after it's been done # once. result = None for mofile in mofiles: key = (class_, os.path.abspath(mofile)) t = _translations.get(key) if t is None: with open(mofile, 'rb') as fp: t = _translations.setdefault(key, class_(fp)) # Copy the translation object to allow setting fallbacks and # output charset. All other instance data is shared with the # cached object. t = copy.copy(t) if codeset: t.set_output_charset(codeset) if result is None: result = t else: result.add_fallback(t) return result def install(domain, localedir=None, unicode=False, codeset=None, names=None): t = translation(domain, localedir, fallback=True, codeset=codeset) t.install(unicode, names) # a mapping b/w domains and locale directories _localedirs = {} # a mapping b/w domains and codesets _localecodesets = {} # current global domain, `messages' used for compatibility w/ GNU gettext _current_domain = 'messages' def textdomain(domain=None): global _current_domain if domain is not None: _current_domain = domain return _current_domain def bindtextdomain(domain, localedir=None): global _localedirs if localedir is not None: _localedirs[domain] = localedir return _localedirs.get(domain, _default_localedir) def bind_textdomain_codeset(domain, codeset=None): global _localecodesets if codeset is not None: _localecodesets[domain] = codeset return _localecodesets.get(domain) def dgettext(domain, message): try: t = translation(domain, _localedirs.get(domain, None), codeset=_localecodesets.get(domain)) except IOError: return message return t.gettext(message) def ldgettext(domain, message): try: t = translation(domain, _localedirs.get(domain, None), codeset=_localecodesets.get(domain)) except IOError: return message return t.lgettext(message) def dngettext(domain, msgid1, msgid2, n): try: t = translation(domain, _localedirs.get(domain, None), codeset=_localecodesets.get(domain)) except IOError: if n == 1: return msgid1 else: return msgid2 return t.ngettext(msgid1, msgid2, n) def ldngettext(domain, msgid1, msgid2, n): try: t = translation(domain, _localedirs.get(domain, None), codeset=_localecodesets.get(domain)) except IOError: if n == 1: return msgid1 else: return msgid2 return t.lngettext(msgid1, msgid2, n) def gettext(message): return dgettext(_current_domain, message) def lgettext(message): return ldgettext(_current_domain, message) def ngettext(msgid1, msgid2, n): return dngettext(_current_domain, msgid1, msgid2, n) def lngettext(msgid1, msgid2, n): return ldngettext(_current_domain, msgid1, msgid2, n) # dcgettext() has been deemed unnecessary and is not implemented. # James Henstridge's Catalog constructor from GNOME gettext. Documented usage # was: # # import gettext # cat = gettext.Catalog(PACKAGE, localedir=LOCALEDIR) # _ = cat.gettext # print _('Hello World') # The resulting catalog object currently don't support access through a # dictionary API, which was supported (but apparently unused) in GNOME # gettext. Catalog = translation
Save