1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 """Perform quality checks on Gettext PO, XLIFF and TMX localization files
22
23 Snippet files whenever a test fails. These can be examined, corrected and
24 merged back into the originals using pomerge
25
26 See: http://translate.sourceforge.net/wiki/toolkit/pofilter for examples and
27 usage instructions and http://translate.sourceforge.net/wiki/toolkit/pofilter_tests
28 for full descriptions of all tests
29 """
30
31 from translate.storage import factory
32 from translate.filters import checks
33 from translate.filters import autocorrect
34 from translate.misc import optrecurse
35 import os
36
38 - def __init__(self, options, checkerclasses=None, checkerconfig=None):
50
52 """lists the docs for filters available on checker..."""
53 filterdict = self.checker.getfilters()
54 filterdocs = ["%s\t%s" % (name, filterfunc.__doc__) for (name, filterfunc) in filterdict.iteritems()]
55 filterdocs.sort()
56 return "\n".join(filterdocs)
57
74
76 """Runs filters on a translation store object.
77 Parameters:
78 - transfile. A translation store object.
79 Return value:
80 - A new translation store object with the results of the filter included."""
81 newtransfile = type(transfile)()
82 for unit in transfile.units:
83 filterresult = self.filterunit(unit)
84 if filterresult:
85 if filterresult != autocorrect:
86 for filtername, filtermessage in filterresult.iteritems():
87 unit.adderror(filtername, filtermessage)
88 if isinstance(filtermessage, checks.SeriousFilterFailure):
89 unit.markfuzzy()
90 newtransfile.addunit(unit)
91 if self.options.includeheader and newtransfile.units > 0:
92 newtransfile.units.insert(0, newtransfile.makeheader())
93 newtransfile.changeencoding("UTF-8")
94 return newtransfile
95
97 """a specialized Option Parser for filter tools..."""
99 """construct the specialized Option Parser"""
100 optrecurse.RecursiveOptionParser.__init__(self, formats)
101 self.set_usage()
102 self.add_option("-l", "--listfilters", action="callback", dest='listfilters',
103 default=False, callback_kwargs={'dest_value': True},
104 callback=self.parse_noinput, help="list filters available")
105
110
146
147 -def runfilter(inputfile, outputfile, templatefile, checkfilter=None):
148 """reads in inputfile, filters using checkfilter, writes to outputfile"""
149 fromfile = factory.getobject(inputfile)
150 tofile = checkfilter.filterfile(fromfile)
151 if tofile.isempty():
152 return 0
153 outputfile.write(str(tofile))
154 return 1
155
157 formats = {"po":("po", runfilter), "pot":("pot", runfilter),
158 "xliff":("xliff", runfilter), "xlf":("xlf", runfilter),
159 "tmx":("tmx", runfilter),
160 None:("po", runfilter)}
161
162 parser = FilterOptionParser(formats)
163 parser.add_option("", "--review", dest="includereview",
164 action="store_true", default=True,
165 help="include units marked for review (default)")
166 parser.add_option("", "--noreview", dest="includereview",
167 action="store_false", default=True,
168 help="exclude units marked for review")
169 parser.add_option("", "--fuzzy", dest="includefuzzy",
170 action="store_true", default=True,
171 help="include units marked fuzzy (default)")
172 parser.add_option("", "--nofuzzy", dest="includefuzzy",
173 action="store_false", default=True,
174 help="exclude units marked fuzzy")
175 parser.add_option("", "--header", dest="includeheader",
176 action="store_true", default=False,
177 help="include a PO header in the output")
178 parser.add_option("", "--autocorrect", dest="autocorrect",
179 action="store_true", default=False,
180 help="output automatic corrections where possible rather than describing issues")
181 parser.add_option("", "--language", dest="targetlanguage", default=None,
182 help="set target language code (e.g. af-ZA) [required for spell check and recommended in general]", metavar="LANG")
183 parser.add_option("", "--openoffice", dest="filterclass",
184 action="store_const", default=None, const=checks.OpenOfficeChecker,
185 help="use the standard checks for OpenOffice translations")
186 parser.add_option("", "--mozilla", dest="filterclass",
187 action="store_const", default=None, const=checks.MozillaChecker,
188 help="use the standard checks for Mozilla translations")
189 parser.add_option("", "--gnome", dest="filterclass",
190 action="store_const", default=None, const=checks.GnomeChecker,
191 help="use the standard checks for Gnome translations")
192 parser.add_option("", "--kde", dest="filterclass",
193 action="store_const", default=None, const=checks.KdeChecker,
194 help="use the standard checks for KDE translations")
195 parser.add_option("", "--wx", dest="filterclass",
196 action="store_const", default=None, const=checks.KdeChecker,
197 help="use the standard checks for wxWidgets translations")
198 parser.add_option("", "--excludefilter", dest="excludefilters",
199 action="append", default=[], type="string", metavar="FILTER",
200 help="don't use FILTER when filtering")
201 parser.add_option("-t", "--test", dest="limitfilters",
202 action="append", default=None, type="string", metavar="FILTER",
203 help="only use test FILTERs specified with this option when filtering")
204 parser.add_option("", "--notranslatefile", dest="notranslatefile",
205 default=None, type="string", metavar="FILE",
206 help="read list of untranslatable words from FILE (must not be translated)")
207 parser.add_option("", "--musttranslatefile", dest="musttranslatefile",
208 default=None, type="string", metavar="FILE",
209 help="read list of translatable words from FILE (must be translated)")
210 parser.add_option("", "--validcharsfile", dest="validcharsfile",
211 default=None, type="string", metavar="FILE",
212 help="read list of all valid characters from FILE (must be in UTF-8)")
213 parser.passthrough.append('checkfilter')
214 parser.description = __doc__
215 return parser
216
218 parser = cmdlineparser()
219 parser.run()
220
221 if __name__ == '__main__':
222 main()
223