1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
#! /usr/bin/python -O
# -*- coding: iso-8859-1 -*-
# this script iterates through the 'html' and 'lib' directories
# looking for php scripts that contain a include_once("xxx_po.inc")
# line and _() functions. It creates/appends to the corresponding
# "xxx_po.inc" file in the 'lang' subdirectory and places the
# i18n strings into the file in the proper format.
#
# usage: genpopo [-v] [-f]
# -v: verbose, print duplicate terms that could be moved to common_po
# -f: force, overwrite existing translated files, otherwise append
#
import sys
print_dupes = '-v' in sys.argv
force = '-f' in sys.argv
import re, os
up = re.compile('_\(\s*"(([^"]|(?<=\\\\)["])+)"')
lang = { 'common_po.po': {} }
current_dir = os.getcwd()
# Find the common_po.po file.
#
common = {}
for dir in ['../lang', 'lang']:
if os.path.exists(dir):
os.chdir(dir)
if os.path.exists('common_po.list'):
f = open('common_po.list','r')
lines = f.readlines()
f.close()
for line in lines:
if line[0] != '#':
common[line[:-1]] = 0
lang['common_po.po'][line[:-1]] = 1
os.chdir(current_dir)
break
os.chdir(current_dir)
else:
print "Can't find common_po.list file."
raise SystemExit
# Find the lang directory.
#
for dir in ['../lang', 'lang']:
if os.path.exists(dir):
lang_dir = dir
break
else:
print "Can't find the lang directory."
raise SystemExit
# Iterate through various places where the php files might be.
#
for dir in ['../html', '../lib', 'html', 'lib']:
if os.path.exists(dir):
# Find all the PHP files in the current directory.
#
files = [x for x in os.listdir(dir)
if (x[-4:] == '.inc' and x[-7:] != '_po.inc')
or x[-6:] == '.class'
or x[-4:] == '.php'
or x[-6:] == '.phtml'
]
os.chdir(dir)
for file in files:
f = open(file,'r')
lines = f.readlines()
f.close()
# Is this file one we need to parse for internationalized strings?
#
parse_file = 0
for line in lines:
match = re.search("include(_once|)\s*\(\s*[\"']([A-Za-z_]+_po.inc)[\"']\s*\);",line)
if match and match.group(2) != "common_po.inc":
po = match.group(2).replace(".inc",".po")
if not lang.has_key(po):
lang[po] = {}
parse_file = 1
break
# If we need to parse the file, do so.
#
if parse_file:
print "Parsing %s..." % file
for line in lines:
match = up.search(line)
while match:
term = match.group(1).replace('\\"','"')
if common.has_key(term):
common[term] += 1
else:
if print_dupes:
for key in lang.keys():
if key != po and lang[key].has_key(term):
print "...Duplicate term: \"%s\" is also in %s." % (term,key)
lang[po][term] = 1
line = line[match.end(1):]
match = up.search(line)
os.chdir(current_dir)
# TODO Now generate all the .inc files if they don't already exist.
# if they do exist, only append new stuff to the end. If the 'force'
# option is passed, just overwrite the entire thing.
#
mapre = re.compile('^\$_t\["en\]["(.*)"].*$')
os.chdir(lang_dir)
if force:
# just going to overwrite any existing files
#
for po in lang.keys():
print "Generating %s..." % po
f = open(po,'w')
f.write("<?\n")
f.write("""# INSTRUCTIONS TO TRANSLATORS:
# blah blah blah....
""")
for term in lang[po].keys():
f.write("\n");
f.write('$_t["en"]["%s"] = "%s";\n' % (term, term))
f.write('# $_t["es"]["%s"] = "--> Spanish translation here. <--";\n' % term)
f.write('# $_t["fr"]["%s"] = "--> French translation here. <--";\n' % term)
f.write('# $_t["de"]["%s"] = "--> German translation here. <--";\n' % term)
f.write("\n");
f.write("?>");
f.close()
else:
# TODO left off here... need to leave existing file intact, and only
# append on terms that are new
#
pass
# Print out warnings for unused and little-used common entries.
#
for key in common.keys():
if common[key] == 1:
print "Warning: common entry '%s' is only used once." % key
for key in common.keys():
if common[key] == 0:
print "Warning: unused common entry '%s'." % key
# vim: ts=2 sw=2 noet ft=python
|