Linux ip-172-26-2-223 5.4.0-1018-aws #18-Ubuntu SMP Wed Jun 24 01:15:00 UTC 2020 x86_64
Apache
: 172.26.2.223 | : 3.12.34.36
Cant Read [ /etc/named.conf ]
8.1.13
www
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
snap /
core /
17200 /
usr /
bin /
[ HOME SHELL ]
Name
Size
Permission
Action
2to3-3.5
96
B
-rwxr-xr-x
[
50.7
KB
-rwxr-xr-x
aa-enabled
22.16
KB
-rwxr-xr-x
abootimg
18.27
KB
-rwxr-xr-x
abootimg-pack-initrd
362
B
-rwxr-xr-x
abootimg-unpack-initrd
272
B
-rwxr-xr-x
addpart
18.45
KB
-rwxr-xr-x
arch
30.7
KB
-rwxr-xr-x
awk
642.72
KB
-rwxr-xr-x
base32
38.73
KB
-rwxr-xr-x
base64
38.73
KB
-rwxr-xr-x
basename
30.67
KB
-rwxr-xr-x
bashbug
6.79
KB
-rwxr-xr-x
bootctl
74.44
KB
-rwxr-xr-x
busctl
363.21
KB
-rwxr-xr-x
c_rehash
6.05
KB
-rwxr-xr-x
captoinfo
70.71
KB
-rwxr-xr-x
catchsegv
3.26
KB
-rwxr-xr-x
cautious-launcher
853
B
-rwxr-xr-x
cgm
17.99
KB
-rwxr-xr-x
chage
60.88
KB
-rwxr-sr-x
chardet3
309
B
-rwxr-xr-x
chardetect3
309
B
-rwxr-xr-x
chattr
10.34
KB
-rwxr-xr-x
chcon
62.92
KB
-rwxr-xr-x
chfn
70.14
KB
-rwsr-xr-x
chrt
26.67
KB
-rwxr-xr-x
chsh
39.48
KB
-rwsr-xr-x
ckbcomp
144.19
KB
-rwxr-xr-x
cksum
30.67
KB
-rwxr-xr-x
clear
6.08
KB
-rwxr-xr-x
clear_console
10.27
KB
-rwxr-xr-x
cloud-id
310
B
-rwxr-xr-x
cloud-init
314
B
-rwxr-xr-x
cloud-init-per
2.06
KB
-rwxr-xr-x
cmp
42.67
KB
-rwxr-xr-x
codepage
10.29
KB
-rwxr-xr-x
comm
34.7
KB
-rwxr-xr-x
compose
17.55
KB
-rwxr-xr-x
console-conf
2.86
KB
-rwxr-xr-x
crontab
35.23
KB
-rwxr-sr-x
csplit
46.86
KB
-rwxr-xr-x
ctstat
18.68
KB
-rwxr-xr-x
cut
38.8
KB
-rwxr-xr-x
dbus-cleanup-sockets
9.98
KB
-rwxr-xr-x
dbus-daemon
218.95
KB
-rwxr-xr-x
dbus-monitor
21.99
KB
-rwxr-xr-x
dbus-run-session
9.98
KB
-rwxr-xr-x
dbus-send
21.98
KB
-rwxr-xr-x
dbus-update-activation-environ...
13.98
KB
-rwxr-xr-x
dbus-uuidgen
9.98
KB
-rwxr-xr-x
deallocvt
10.3
KB
-rwxr-xr-x
deb-systemd-helper
17.99
KB
-rwxr-xr-x
deb-systemd-invoke
4.37
KB
-rwxr-xr-x
debconf
2.79
KB
-rwxr-xr-x
debconf-apt-progress
11.27
KB
-rwxr-xr-x
debconf-communicate
608
B
-rwxr-xr-x
debconf-copydb
1.68
KB
-rwxr-xr-x
debconf-escape
647
B
-rwxr-xr-x
debconf-set-selections
2.87
KB
-rwxr-xr-x
debconf-show
1.78
KB
-rwxr-xr-x
delpart
18.45
KB
-rwxr-xr-x
dh_bash-completion
2.49
KB
-rwxr-xr-x
dh_pypy
11.71
KB
-rwxr-xr-x
dh_python3
11.91
KB
-rwxr-xr-x
diff
123.08
KB
-rwxr-xr-x
diff3
54.86
KB
-rwxr-xr-x
dircolors
38.71
KB
-rwxr-xr-x
dirname
30.67
KB
-rwxr-xr-x
dotlockfile
14.51
KB
-rwxr-sr-x
dpkg-deb
131.43
KB
-rwxr-xr-x
du
119.17
KB
-rwxr-xr-x
dumpimage
139.06
KB
-rwxr-xr-x
dumpkeys
174.52
KB
-rwxr-xr-x
ec2metadata
7.12
KB
-rwxr-xr-x
edit
17.55
KB
-rwxr-xr-x
editor
1.02
MB
-rwxr-xr-x
env
30.67
KB
-rwxr-xr-x
envsubst
34.51
KB
-rwxr-xr-x
ex
1.02
MB
-rwxr-xr-x
expand
30.73
KB
-rwxr-xr-x
expiry
22.23
KB
-rwxr-sr-x
expr
38.73
KB
-rwxr-xr-x
factor
70.77
KB
-rwxr-xr-x
faillog
18.25
KB
-rwxr-xr-x
fallocate
22.56
KB
-rwxr-xr-x
finalrd
2.1
KB
-rwxr-xr-x
find
216.57
KB
-rwxr-xr-x
flock
26.71
KB
-rwxr-xr-x
fmt
38.7
KB
-rwxr-xr-x
fold
34.7
KB
-rwxr-xr-x
free
18.37
KB
-rwxr-xr-x
fw_printenv
36.29
KB
-rwxr-xr-x
fw_setenv
36.29
KB
-rwxr-xr-x
fwupdate
13.99
KB
-rwxr-xr-x
gawk
642.72
KB
-rwxr-xr-x
gdbserver
408.53
KB
-rwxr-xr-x
getconf
22.41
KB
-rwxr-xr-x
getent
27.3
KB
-rwxr-xr-x
getkeycodes
10.3
KB
-rwxr-xr-x
getopt
14.43
KB
-rwxr-xr-x
gettext
34.48
KB
-rwxr-xr-x
gettext.sh
4.52
KB
-rwxr-xr-x
gpasswd
73.54
KB
-rwsr-xr-x
gpg
984.87
KB
-rwxr-xr-x
gpg-zip
3.23
KB
-rwxr-xr-x
gpgsplit
58.76
KB
-rwxr-xr-x
gpgv
363.63
KB
-rwxr-xr-x
groups
30.7
KB
-rwxr-xr-x
growpart
20.99
KB
-rwxr-xr-x
grub-editenv
228.78
KB
-rwxr-xr-x
head
38.73
KB
-rwxr-xr-x
helpztags
2.46
KB
-rwxr-xr-x
hostid
26.64
KB
-rwxr-xr-x
hostnamectl
287.2
KB
-rwxr-xr-x
i386
14.38
KB
-rwxr-xr-x
iconv
59
KB
-rwxr-xr-x
id
38.83
KB
-rwxr-xr-x
igawk
3.11
KB
-rwxr-xr-x
infocmp
54.57
KB
-rwxr-xr-x
infotocap
70.71
KB
-rwxr-xr-x
install
135.59
KB
-rwxr-xr-x
ionice
22.59
KB
-rwxr-xr-x
ipcmk
22.69
KB
-rwxr-xr-x
ipcrm
26.54
KB
-rwxr-xr-x
ipcs
46.71
KB
-rwxr-xr-x
ischroot
10.34
KB
-rwxr-xr-x
join
46.77
KB
-rwxr-xr-x
jsondiff
976
B
-rwxr-xr-x
jsonpatch
3.58
KB
-rwxr-xr-x
jsonpointer
1.31
KB
-rwxr-xr-x
jwt3
288
B
-rwxr-xr-x
kbdinfo
10.31
KB
-rwxr-xr-x
kwboot
14.33
KB
-rwxr-xr-x
last
38.84
KB
-rwxr-xr-x
lastb
38.84
KB
-rwxr-xr-x
lastlog
14.03
KB
-rwxr-xr-x
lcf
7.6
KB
-rwxr-xr-x
ldd
5.3
KB
-rwxr-xr-x
less
175.84
KB
-rwxr-xr-x
lessecho
14.31
KB
-rwxr-xr-x
lessfile
8.36
KB
-rwxr-xr-x
lesskey
23.72
KB
-rwxr-xr-x
lesspipe
8.36
KB
-rwxr-xr-x
line
10.32
KB
-rwxr-xr-x
link
26.64
KB
-rwxr-xr-x
linux-check-removal
3.99
KB
-rwxr-xr-x
linux-update-symlinks
6.17
KB
-rwxr-xr-x
linux-version
2.63
KB
-rwxr-xr-x
linux32
14.38
KB
-rwxr-xr-x
linux64
14.38
KB
-rwxr-xr-x
lnstat
18.68
KB
-rwxr-xr-x
loadkeys
210.57
KB
-rwxr-xr-x
loadunimap
26.66
KB
-rwxr-xr-x
locale
37.91
KB
-rwxr-xr-x
localectl
295.22
KB
-rwxr-xr-x
localedef
315.71
KB
-rwxr-xr-x
lockfile-check
14.25
KB
-rwxr-xr-x
lockfile-create
14.25
KB
-rwxr-xr-x
lockfile-remove
14.25
KB
-rwxr-xr-x
lockfile-touch
14.25
KB
-rwxr-xr-x
logger
35.35
KB
-rwxr-xr-x
logname
26.67
KB
-rwxr-xr-x
lsattr
10.33
KB
-rwxr-xr-x
lscpu
55.12
KB
-rwxr-xr-x
lsinitramfs
2.43
KB
-rwxr-xr-x
lsipc
59
KB
-rwxr-xr-x
lslocks
31.09
KB
-rwxr-xr-x
lslogins
51.15
KB
-rwxr-xr-x
lspgpot
1.06
KB
-rwxr-xr-x
lzcat
67.11
KB
-rwxr-xr-x
lzcmp
5.39
KB
-rwxr-xr-x
lzdiff
5.39
KB
-rwxr-xr-x
lzegrep
5.56
KB
-rwxr-xr-x
lzfgrep
5.56
KB
-rwxr-xr-x
lzgrep
5.56
KB
-rwxr-xr-x
lzless
1.78
KB
-rwxr-xr-x
lzma
67.11
KB
-rwxr-xr-x
lzmainfo
10.31
KB
-rwxr-xr-x
lzmore
2.12
KB
-rwxr-xr-x
mail-lock
14.25
KB
-rwxr-sr-x
mail-touchlock
14.25
KB
-rwxr-sr-x
mail-unlock
14.25
KB
-rwxr-sr-x
mapscrn
18.66
KB
-rwxr-xr-x
mawk
115.01
KB
-rwxr-xr-x
mcookie
26.71
KB
-rwxr-xr-x
md5sum
42.77
KB
-rwxr-xr-x
md5sum.textutils
42.77
KB
-rwxr-xr-x
mesg
10.37
KB
-rwxr-xr-x
mk_modmap
15.78
KB
-rwxr-xr-x
mkenvimage
14.2
KB
-rwxr-xr-x
mkfifo
58.95
KB
-rwxr-xr-x
mkimage
143.06
KB
-rwxr-xr-x
mkknlimg
5.87
KB
-rwxr-xr-x
mksquashfs
174.12
KB
-rwxr-xr-x
mksunxiboot
6.12
KB
-rwxr-xr-x
mkswapfile
865
B
-rwxr-xr-x
namei
26.58
KB
-rwxr-xr-x
nawk
642.72
KB
-rwxr-xr-x
newgrp
38.97
KB
-rwsr-xr-x
ngettext
34.5
KB
-rwxr-xr-x
nice
34.7
KB
-rwxr-xr-x
nl
38.83
KB
-rwxr-xr-x
nohup
30.7
KB
-rwxr-xr-x
nproc
30.7
KB
-rwxr-xr-x
nsenter
26.88
KB
-rwxr-xr-x
nstat
22.47
KB
-rwxr-xr-x
numfmt
58.86
KB
-rwxr-xr-x
od
66.83
KB
-rwxr-xr-x
openssl
545.97
KB
-rwxr-xr-x
pager
166.73
KB
-rwxr-xr-x
partx
75.63
KB
-rwxr-xr-x
passwd
52.98
KB
-rwsr-xr-x
paste
30.7
KB
-rwxr-xr-x
pathchk
30.67
KB
-rwxr-xr-x
pdb3
59.56
KB
-rwxr-xr-x
pdb3.5
59.56
KB
-rwxr-xr-x
perl
1.82
MB
-rwxr-xr-x
perl5.22.1
1.82
MB
-rwxr-xr-x
pg
38.91
KB
-rwxr-xr-x
pgrep
26.63
KB
-rwxr-xr-x
pinky
34.86
KB
-rwxr-xr-x
pkill
26.63
KB
-rwxr-xr-x
pldd
14.59
KB
-rwxr-xr-x
plog
146
B
-rwxr-xr-x
pmap
30.61
KB
-rwxr-xr-x
poff
2.77
KB
-rwxr-xr-x
pon
1.33
KB
-rwxr-xr-x
pr
74.95
KB
-rwxr-xr-x
print
17.55
KB
-rwxr-xr-x
printenv
30.64
KB
-rwxr-xr-x
printf
46.73
KB
-rwxr-xr-x
prlimit
31.3
KB
-rwxr-xr-x
probert
2.09
KB
-rwxr-xr-x
psfaddtable
18.42
KB
-rwxr-xr-x
psfgettable
18.42
KB
-rwxr-xr-x
psfstriptable
18.42
KB
-rwxr-xr-x
psfxtable
18.42
KB
-rwxr-xr-x
ptx
66.95
KB
-rwxr-xr-x
pwdx
10.36
KB
-rwxr-xr-x
py3clean
7.62
KB
-rwxr-xr-x
py3compile
11.83
KB
-rwxr-xr-x
py3versions
11.44
KB
-rwxr-xr-x
pybuild
21.33
KB
-rwxr-xr-x
pydoc3
79
B
-rwxr-xr-x
pydoc3.5
79
B
-rwxr-xr-x
pygettext3
21.73
KB
-rwxr-xr-x
pygettext3.5
21.73
KB
-rwxr-xr-x
python3
4.25
MB
-rwxr-xr-x
python3-jsondiff
976
B
-rwxr-xr-x
python3-jsonpatch
3.58
KB
-rwxr-xr-x
python3-jsonpointer
1.31
KB
-rwxr-xr-x
python3.5
4.25
MB
-rwxr-xr-x
python3.5m
4.25
MB
-rwxr-xr-x
python3m
4.25
MB
-rwxr-xr-x
rcp
86.14
KB
-rwxr-xr-x
realpath
58.83
KB
-rwxr-xr-x
rename.ul
14.41
KB
-rwxr-xr-x
renice
10.38
KB
-rwxr-xr-x
reset
18.42
KB
-rwxr-xr-x
resizecons
18.6
KB
-rwxr-xr-x
resizepart
34.86
KB
-rwxr-xr-x
rev
10.38
KB
-rwxr-xr-x
rgrep
30
B
-rwxr-xr-x
rlogin
690.67
KB
-rwxr-xr-x
routef
173
B
-rwxr-xr-x
routel
1.23
KB
-rwxr-xr-x
rsh
690.67
KB
-rwxr-xr-x
rtstat
18.68
KB
-rwxr-xr-x
run-mailcap
17.55
KB
-rwxr-xr-x
runcon
34.8
KB
-rwxr-xr-x
rview
1.02
MB
-rwxr-xr-x
savelog
10.22
KB
-rwxr-xr-x
sc-logresolve
816
B
-rwxr-xr-x
scmp_sys_resolver
10.26
KB
-rwxr-xr-x
scp
86.14
KB
-rwxr-xr-x
screendump
10.33
KB
-rwxr-xr-x
script
22.66
KB
-rwxr-xr-x
scriptreplay
14.4
KB
-rwxr-xr-x
sdiff
46.78
KB
-rwxr-xr-x
see
17.55
KB
-rwxr-xr-x
select-editor
1.19
KB
-rwxr-xr-x
sensible-browser
1.11
KB
-rwxr-xr-x
sensible-editor
1.08
KB
-rwxr-xr-x
sensible-pager
288
B
-rwxr-xr-x
seq
46.73
KB
-rwxr-xr-x
setarch
14.38
KB
-rwxr-xr-x
setkeycodes
10.29
KB
-rwxr-xr-x
setleds
10.32
KB
-rwxr-xr-x
setlogcons
10.27
KB
-rwxr-xr-x
setmetamode
10.37
KB
-rwxr-xr-x
setsid
10.38
KB
-rwxr-xr-x
setterm
34.61
KB
-rwxr-xr-x
sftp
134.36
KB
-rwxr-xr-x
sg
38.97
KB
-rwsr-xr-x
sha1sum
42.77
KB
-rwxr-xr-x
sha224sum
50.77
KB
-rwxr-xr-x
sha256sum
50.77
KB
-rwxr-xr-x
sha384sum
54.77
KB
-rwxr-xr-x
sha512sum
54.77
KB
-rwxr-xr-x
showconsolefont
18.4
KB
-rwxr-xr-x
showkey
14.34
KB
-rwxr-xr-x
shred
54.92
KB
-rwxr-xr-x
shuf
54.83
KB
-rwxr-xr-x
skill
22.61
KB
-rwxr-xr-x
slabtop
18.47
KB
-rwxr-xr-x
slogin
690.67
KB
-rwxr-xr-x
snap
15.85
MB
-rwxr-xr-x
snapctl
6.13
MB
-rwxr-xr-x
snapfuse
38.61
KB
-rwxr-xr-x
snice
22.61
KB
-rwxr-xr-x
sort
107.46
KB
-rwxr-xr-x
split
67.41
KB
-rwxr-xr-x
splitfont
10.27
KB
-rwxr-xr-x
ssh
690.67
KB
-rwxr-xr-x
ssh-add
330.21
KB
-rwxr-xr-x
ssh-agent
350.22
KB
-rwxr-sr-x
ssh-argv0
1.42
KB
-rwxr-xr-x
ssh-copy-id
10.12
KB
-rwxr-xr-x
ssh-keygen
390.23
KB
-rwxr-xr-x
ssh-keyscan
406.23
KB
-rwxr-xr-x
stat
79.05
KB
-rwxr-xr-x
stdbuf
62.83
KB
-rwxr-xr-x
sudo
133.6
KB
-rwsr-xr-x
sudoedit
133.6
KB
-rwsr-xr-x
sudoreplay
46.56
KB
-rwxr-xr-x
sum
38.74
KB
-rwxr-xr-x
systemd-analyze
1.43
MB
-rwxr-xr-x
systemd-cat
34.43
KB
-rwxr-xr-x
systemd-cgls
291.22
KB
-rwxr-xr-x
systemd-cgtop
303.3
KB
-rwxr-xr-x
systemd-delta
62.59
KB
-rwxr-xr-x
systemd-detect-virt
34.42
KB
-rwxr-xr-x
systemd-path
42.42
KB
-rwxr-xr-x
systemd-resolve
327.21
KB
-rwxr-xr-x
systemd-run
367.52
KB
-rwxr-xr-x
systemd-stdio-bridge
343.2
KB
-rwxr-xr-x
tabs
14.23
KB
-rwxr-xr-x
tac
34.73
KB
-rwxr-xr-x
tail
62.92
KB
-rwxr-xr-x
taskset
30.68
KB
-rwxr-xr-x
tee
34.73
KB
-rwxr-xr-x
test
46.7
KB
-rwxr-xr-x
tic
70.71
KB
-rwxr-xr-x
timedatectl
813
B
-rwxr-xr-x
timedatectl.real
295.22
KB
-rwxr-xr-x
timeout
55.38
KB
-rwxr-xr-x
tload
14.44
KB
-rwxr-xr-x
toe
14.34
KB
-rwxr-xr-x
top
106.51
KB
-rwxr-xr-x
touch
98.37
KB
-rwxr-xr-x
tput
14.3
KB
-rwxr-xr-x
tr
46.73
KB
-rwxr-xr-x
truncate
50.8
KB
-rwxr-xr-x
tset
18.42
KB
-rwxr-xr-x
tsort
34.67
KB
-rwxr-xr-x
tty
26.67
KB
-rwxr-xr-x
tzselect
14.86
KB
-rwxr-xr-x
ubuntu-core-launcher
124.53
KB
-rwsr-xr-x
ucf
39.68
KB
-rwxr-xr-x
ucfq
18.91
KB
-rwxr-xr-x
ucfr
10.47
KB
-rwxr-xr-x
unexpand
30.73
KB
-rwxr-xr-x
unicode_stop
530
B
-rwxr-xr-x
uniq
42.77
KB
-rwxr-xr-x
unlink
26.64
KB
-rwxr-xr-x
unlzma
67.11
KB
-rwxr-xr-x
unshare
18.72
KB
-rwxr-xr-x
unsquashfs
92.65
KB
-rwxr-xr-x
unxz
67.11
KB
-rwxr-xr-x
update-alternatives
46.61
KB
-rwxr-xr-x
uptime
10.33
KB
-rwxr-xr-x
users
30.7
KB
-rwxr-xr-x
utmpdump
14.52
KB
-rwxr-xr-x
vcs-run
6.75
KB
-rwxr-xr-x
vi
1.02
MB
-rwxr-xr-x
view
1.02
MB
-rwxr-xr-x
vim.tiny
1.02
MB
-rwxr-xr-x
vmstat
30.48
KB
-rwxr-xr-x
w
18.48
KB
-rwxr-xr-x
w.procps
18.48
KB
-rwxr-xr-x
wall
26.73
KB
-rwxr-sr-x
watch
23.14
KB
-rwxr-xr-x
wc
42.8
KB
-rwxr-xr-x
whereis
23.09
KB
-rwxr-xr-x
which
946
B
-rwxr-xr-x
who
46.86
KB
-rwxr-xr-x
whoami
26.67
KB
-rwxr-xr-x
wpa_passphrase
58
KB
-rwxr-xr-x
x86_64
14.38
KB
-rwxr-xr-x
xargs
66.21
KB
-rwxr-xr-x
xdelta3
150.84
KB
-rwxr-xr-x
xdg-open
38
B
-rwxr-xr-x
xdg-settings
886
B
-rwxr-xr-x
xxd
18.12
KB
-rwxr-xr-x
xz
67.11
KB
-rwxr-xr-x
xzcat
67.11
KB
-rwxr-xr-x
xzcmp
5.39
KB
-rwxr-xr-x
xzdiff
5.39
KB
-rwxr-xr-x
xzegrep
5.56
KB
-rwxr-xr-x
xzfgrep
5.56
KB
-rwxr-xr-x
xzgrep
5.56
KB
-rwxr-xr-x
xzless
1.78
KB
-rwxr-xr-x
xzmore
2.12
KB
-rwxr-xr-x
yes
30.67
KB
-rwxr-xr-x
zdump
14.42
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : pygettext3
#! /usr/bin/python3.5 # -*- coding: iso-8859-1 -*- # Originally written by Barry Warsaw <barry@python.org> # # Minimally patched to make it even more xgettext compatible # by Peter Funk <pf@artcom-gmbh.de> # # 2002-11-22 J�rgen Hermann <jh@web.de> # Added checks that _() only contains string literals, and # command line args are resolved to module lists, i.e. you # can now pass a filename, a module or package name, or a # directory (including globbing chars, important for Win32). # Made docstring fit in 80 chars wide displays using pydoc. # # for selftesting try: import fintl _ = fintl.gettext except ImportError: _ = lambda s: s __doc__ = _("""pygettext -- Python equivalent of xgettext(1) Many systems (Solaris, Linux, Gnu) provide extensive tools that ease the internationalization of C programs. Most of these tools are independent of the programming language and can be used from within Python programs. Martin von Loewis' work[1] helps considerably in this regard. There's one problem though; xgettext is the program that scans source code looking for message strings, but it groks only C (or C++). Python introduces a few wrinkles, such as dual quoting characters, triple quoted strings, and raw strings. xgettext understands none of this. Enter pygettext, which uses Python's standard tokenize module to scan Python source code, generating .pot files identical to what GNU xgettext[2] generates for C and C++ code. From there, the standard GNU tools can be used. A word about marking Python strings as candidates for translation. GNU xgettext recognizes the following keywords: gettext, dgettext, dcgettext, and gettext_noop. But those can be a lot of text to include all over your code. C and C++ have a trick: they use the C preprocessor. Most internationalized C source includes a #define for gettext() to _() so that what has to be written in the source is much less. Thus these are both translatable strings: gettext("Translatable String") _("Translatable String") Python of course has no preprocessor so this doesn't work so well. Thus, pygettext searches only for _() by default, but see the -k/--keyword flag below for how to augment this. [1] http://www.python.org/workshops/1997-10/proceedings/loewis.html [2] http://www.gnu.org/software/gettext/gettext.html NOTE: pygettext attempts to be option and feature compatible with GNU xgettext where ever possible. However some options are still missing or are not fully implemented. Also, xgettext's use of command line switches with option arguments is broken, and in these cases, pygettext just defines additional switches. Usage: pygettext [options] inputfile ... Options: -a --extract-all Extract all strings. -d name --default-domain=name Rename the default output file from messages.pot to name.pot. -E --escape Replace non-ASCII characters with octal escape sequences. -D --docstrings Extract module, class, method, and function docstrings. These do not need to be wrapped in _() markers, and in fact cannot be for Python to consider them docstrings. (See also the -X option). -h --help Print this help message and exit. -k word --keyword=word Keywords to look for in addition to the default set, which are: %(DEFAULTKEYWORDS)s You can have multiple -k flags on the command line. -K --no-default-keywords Disable the default set of keywords (see above). Any keywords explicitly added with the -k/--keyword option are still recognized. --no-location Do not write filename/lineno location comments. -n --add-location Write filename/lineno location comments indicating where each extracted string is found in the source. These lines appear before each msgid. The style of comments is controlled by the -S/--style option. This is the default. -o filename --output=filename Rename the default output file from messages.pot to filename. If filename is `-' then the output is sent to standard out. -p dir --output-dir=dir Output files will be placed in directory dir. -S stylename --style stylename Specify which style to use for location comments. Two styles are supported: Solaris # File: filename, line: line-number GNU #: filename:line The style name is case insensitive. GNU style is the default. -v --verbose Print the names of the files being processed. -V --version Print the version of pygettext and exit. -w columns --width=columns Set width of output to columns. -x filename --exclude-file=filename Specify a file that contains a list of strings that are not be extracted from the input files. Each string to be excluded must appear on a line by itself in the file. -X filename --no-docstrings=filename Specify a file that contains a list of files (one per line) that should not have their docstrings extracted. This is only useful in conjunction with the -D option above. If `inputfile' is -, standard input is read. """) import os import imp import sys import glob import time import getopt import token import tokenize __version__ = '1.5' default_keywords = ['_'] DEFAULTKEYWORDS = ', '.join(default_keywords) EMPTYSTRING = '' # The normal pot-file header. msgmerge and Emacs's po-mode work better if it's # there. pot_header = _('''\ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\\n" "POT-Creation-Date: %(time)s\\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n" "Language-Team: LANGUAGE <LL@li.org>\\n" "MIME-Version: 1.0\\n" "Content-Type: text/plain; charset=%(charset)s\\n" "Content-Transfer-Encoding: %(encoding)s\\n" "Generated-By: pygettext.py %(version)s\\n" ''') def usage(code, msg=''): print(__doc__ % globals(), file=sys.stderr) if msg: print(msg, file=sys.stderr) sys.exit(code) def make_escapes(pass_nonascii): global escapes, escape if pass_nonascii: # Allow non-ascii characters to pass through so that e.g. 'msgid # "H�he"' would result not result in 'msgid "H\366he"'. Otherwise we # escape any character outside the 32..126 range. mod = 128 escape = escape_ascii else: mod = 256 escape = escape_nonascii escapes = [r"\%03o" % i for i in range(mod)] for i in range(32, 127): escapes[i] = chr(i) escapes[ord('\\')] = r'\\' escapes[ord('\t')] = r'\t' escapes[ord('\r')] = r'\r' escapes[ord('\n')] = r'\n' escapes[ord('\"')] = r'\"' def escape_ascii(s, encoding): return ''.join(escapes[ord(c)] if ord(c) < 128 else c for c in s) def escape_nonascii(s, encoding): return ''.join(escapes[b] for b in s.encode(encoding)) def safe_eval(s): # unwrap quotes, safely return eval(s, {'__builtins__':{}}, {}) def normalize(s, encoding): # This converts the various Python string types into a format that is # appropriate for .po files, namely much closer to C style. lines = s.split('\n') if len(lines) == 1: s = '"' + escape(s, encoding) + '"' else: if not lines[-1]: del lines[-1] lines[-1] = lines[-1] + '\n' for i in range(len(lines)): lines[i] = escape(lines[i], encoding) lineterm = '\\n"\n"' s = '""\n"' + lineterm.join(lines) + '"' return s def containsAny(str, set): """Check whether 'str' contains ANY of the chars in 'set'""" return 1 in [c in str for c in set] def _visit_pyfiles(list, dirname, names): """Helper for getFilesForName().""" # get extension for python source files if '_py_ext' not in globals(): global _py_ext _py_ext = [triple[0] for triple in imp.get_suffixes() if triple[2] == imp.PY_SOURCE][0] # don't recurse into CVS directories if 'CVS' in names: names.remove('CVS') # add all *.py files to list list.extend( [os.path.join(dirname, file) for file in names if os.path.splitext(file)[1] == _py_ext] ) def _get_modpkg_path(dotted_name, pathlist=None): """Get the filesystem path for a module or a package. Return the file system path to a file for a module, and to a directory for a package. Return None if the name is not found, or is a builtin or extension module. """ # split off top-most name parts = dotted_name.split('.', 1) if len(parts) > 1: # we have a dotted path, import top-level package try: file, pathname, description = imp.find_module(parts[0], pathlist) if file: file.close() except ImportError: return None # check if it's indeed a package if description[2] == imp.PKG_DIRECTORY: # recursively handle the remaining name parts pathname = _get_modpkg_path(parts[1], [pathname]) else: pathname = None else: # plain name try: file, pathname, description = imp.find_module( dotted_name, pathlist) if file: file.close() if description[2] not in [imp.PY_SOURCE, imp.PKG_DIRECTORY]: pathname = None except ImportError: pathname = None return pathname def getFilesForName(name): """Get a list of module files for a filename, a module or package name, or a directory. """ if not os.path.exists(name): # check for glob chars if containsAny(name, "*?[]"): files = glob.glob(name) list = [] for file in files: list.extend(getFilesForName(file)) return list # try to find module or package name = _get_modpkg_path(name) if not name: return [] if os.path.isdir(name): # find all python files in directory list = [] os.walk(name, _visit_pyfiles, list) return list elif os.path.exists(name): # a single file return [name] return [] class TokenEater: def __init__(self, options): self.__options = options self.__messages = {} self.__state = self.__waiting self.__data = [] self.__lineno = -1 self.__freshmodule = 1 self.__curfile = None def __call__(self, ttype, tstring, stup, etup, line): # dispatch ## import token ## print >> sys.stderr, 'ttype:', token.tok_name[ttype], \ ## 'tstring:', tstring self.__state(ttype, tstring, stup[0]) def __waiting(self, ttype, tstring, lineno): opts = self.__options # Do docstring extractions, if enabled if opts.docstrings and not opts.nodocstrings.get(self.__curfile): # module docstring? if self.__freshmodule: if ttype == tokenize.STRING: self.__addentry(safe_eval(tstring), lineno, isdocstring=1) self.__freshmodule = 0 elif ttype not in (tokenize.COMMENT, tokenize.NL): self.__freshmodule = 0 return # class docstring? if ttype == tokenize.NAME and tstring in ('class', 'def'): self.__state = self.__suiteseen return if ttype == tokenize.NAME and tstring in opts.keywords: self.__state = self.__keywordseen def __suiteseen(self, ttype, tstring, lineno): # ignore anything until we see the colon if ttype == tokenize.OP and tstring == ':': self.__state = self.__suitedocstring def __suitedocstring(self, ttype, tstring, lineno): # ignore any intervening noise if ttype == tokenize.STRING: self.__addentry(safe_eval(tstring), lineno, isdocstring=1) self.__state = self.__waiting elif ttype not in (tokenize.NEWLINE, tokenize.INDENT, tokenize.COMMENT): # there was no class docstring self.__state = self.__waiting def __keywordseen(self, ttype, tstring, lineno): if ttype == tokenize.OP and tstring == '(': self.__data = [] self.__lineno = lineno self.__state = self.__openseen else: self.__state = self.__waiting def __openseen(self, ttype, tstring, lineno): if ttype == tokenize.OP and tstring == ')': # We've seen the last of the translatable strings. Record the # line number of the first line of the strings and update the list # of messages seen. Reset state for the next batch. If there # were no strings inside _(), then just ignore this entry. if self.__data: self.__addentry(EMPTYSTRING.join(self.__data)) self.__state = self.__waiting elif ttype == tokenize.STRING: self.__data.append(safe_eval(tstring)) elif ttype not in [tokenize.COMMENT, token.INDENT, token.DEDENT, token.NEWLINE, tokenize.NL]: # warn if we see anything else than STRING or whitespace print(_( '*** %(file)s:%(lineno)s: Seen unexpected token "%(token)s"' ) % { 'token': tstring, 'file': self.__curfile, 'lineno': self.__lineno }, file=sys.stderr) self.__state = self.__waiting def __addentry(self, msg, lineno=None, isdocstring=0): if lineno is None: lineno = self.__lineno if not msg in self.__options.toexclude: entry = (self.__curfile, lineno) self.__messages.setdefault(msg, {})[entry] = isdocstring def set_filename(self, filename): self.__curfile = filename self.__freshmodule = 1 def write(self, fp): options = self.__options timestamp = time.strftime('%Y-%m-%d %H:%M%z') encoding = fp.encoding if fp.encoding else 'UTF-8' print(pot_header % {'time': timestamp, 'version': __version__, 'charset': encoding, 'encoding': '8bit'}, file=fp) # Sort the entries. First sort each particular entry's keys, then # sort all the entries by their first item. reverse = {} for k, v in self.__messages.items(): keys = sorted(v.keys()) reverse.setdefault(tuple(keys), []).append((k, v)) rkeys = sorted(reverse.keys()) for rkey in rkeys: rentries = reverse[rkey] rentries.sort() for k, v in rentries: # If the entry was gleaned out of a docstring, then add a # comment stating so. This is to aid translators who may wish # to skip translating some unimportant docstrings. isdocstring = any(v.values()) # k is the message string, v is a dictionary-set of (filename, # lineno) tuples. We want to sort the entries in v first by # file name and then by line number. v = sorted(v.keys()) if not options.writelocations: pass # location comments are different b/w Solaris and GNU: elif options.locationstyle == options.SOLARIS: for filename, lineno in v: d = {'filename': filename, 'lineno': lineno} print(_( '# File: %(filename)s, line: %(lineno)d') % d, file=fp) elif options.locationstyle == options.GNU: # fit as many locations on one line, as long as the # resulting line length doesn't exceeds 'options.width' locline = '#:' for filename, lineno in v: d = {'filename': filename, 'lineno': lineno} s = _(' %(filename)s:%(lineno)d') % d if len(locline) + len(s) <= options.width: locline = locline + s else: print(locline, file=fp) locline = "#:" + s if len(locline) > 2: print(locline, file=fp) if isdocstring: print('#, docstring', file=fp) print('msgid', normalize(k, encoding), file=fp) print('msgstr ""\n', file=fp) def main(): global default_keywords try: opts, args = getopt.getopt( sys.argv[1:], 'ad:DEhk:Kno:p:S:Vvw:x:X:', ['extract-all', 'default-domain=', 'escape', 'help', 'keyword=', 'no-default-keywords', 'add-location', 'no-location', 'output=', 'output-dir=', 'style=', 'verbose', 'version', 'width=', 'exclude-file=', 'docstrings', 'no-docstrings', ]) except getopt.error as msg: usage(1, msg) # for holding option values class Options: # constants GNU = 1 SOLARIS = 2 # defaults extractall = 0 # FIXME: currently this option has no effect at all. escape = 0 keywords = [] outpath = '' outfile = 'messages.pot' writelocations = 1 locationstyle = GNU verbose = 0 width = 78 excludefilename = '' docstrings = 0 nodocstrings = {} options = Options() locations = {'gnu' : options.GNU, 'solaris' : options.SOLARIS, } # parse options for opt, arg in opts: if opt in ('-h', '--help'): usage(0) elif opt in ('-a', '--extract-all'): options.extractall = 1 elif opt in ('-d', '--default-domain'): options.outfile = arg + '.pot' elif opt in ('-E', '--escape'): options.escape = 1 elif opt in ('-D', '--docstrings'): options.docstrings = 1 elif opt in ('-k', '--keyword'): options.keywords.append(arg) elif opt in ('-K', '--no-default-keywords'): default_keywords = [] elif opt in ('-n', '--add-location'): options.writelocations = 1 elif opt in ('--no-location',): options.writelocations = 0 elif opt in ('-S', '--style'): options.locationstyle = locations.get(arg.lower()) if options.locationstyle is None: usage(1, _('Invalid value for --style: %s') % arg) elif opt in ('-o', '--output'): options.outfile = arg elif opt in ('-p', '--output-dir'): options.outpath = arg elif opt in ('-v', '--verbose'): options.verbose = 1 elif opt in ('-V', '--version'): print(_('pygettext.py (xgettext for Python) %s') % __version__) sys.exit(0) elif opt in ('-w', '--width'): try: options.width = int(arg) except ValueError: usage(1, _('--width argument must be an integer: %s') % arg) elif opt in ('-x', '--exclude-file'): options.excludefilename = arg elif opt in ('-X', '--no-docstrings'): fp = open(arg) try: while 1: line = fp.readline() if not line: break options.nodocstrings[line[:-1]] = 1 finally: fp.close() # calculate escapes make_escapes(not options.escape) # calculate all keywords options.keywords.extend(default_keywords) # initialize list of strings to exclude if options.excludefilename: try: fp = open(options.excludefilename) options.toexclude = fp.readlines() fp.close() except IOError: print(_( "Can't read --exclude-file: %s") % options.excludefilename, file=sys.stderr) sys.exit(1) else: options.toexclude = [] # resolve args to module lists expanded = [] for arg in args: if arg == '-': expanded.append(arg) else: expanded.extend(getFilesForName(arg)) args = expanded # slurp through all the files eater = TokenEater(options) for filename in args: if filename == '-': if options.verbose: print(_('Reading standard input')) fp = sys.stdin.buffer closep = 0 else: if options.verbose: print(_('Working on %s') % filename) fp = open(filename, 'rb') closep = 1 try: eater.set_filename(filename) try: tokens = tokenize.tokenize(fp.readline) for _token in tokens: eater(*_token) except tokenize.TokenError as e: print('%s: %s, line %d, column %d' % ( e.args[0], filename, e.args[1][0], e.args[1][1]), file=sys.stderr) finally: if closep: fp.close() # write the output if options.outfile == '-': fp = sys.stdout closep = 0 else: if options.outpath: options.outfile = os.path.join(options.outpath, options.outfile) fp = open(options.outfile, 'w') closep = 1 try: eater.write(fp) finally: if closep: fp.close() if __name__ == '__main__': main() # some more test strings # this one creates a warning _('*** Seen unexpected token "%(token)s"') % {'token': 'test'} _('more' 'than' 'one' 'string')
Close