1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 """convert an OpenOffice.org (SDF) localization file to Gettext PO localization files
24
25 See: http://translate.sourceforge.net/wiki/toolkit/oo2po for examples and
26 usage instructions
27 """
28
29 import sys
30 from urllib import urlencode
31
32 from translate.storage import po
33 from translate.storage import oo
34
35
36
37
39
40 - def __init__(self, sourcelanguage, targetlanguage, blankmsgstr=False, long_keys=False):
46
47 - def maketargetunit(self, part1, part2, translators_comment, key, subkey):
48 """makes a base unit (.po or XLIFF) out of a subkey of two parts"""
49
50 text1 = getattr(part1, subkey)
51 if text1 == "":
52 return None
53 text2 = getattr(part2, subkey)
54
55 unit = po.pounit(text1.decode('utf-8'), encoding="UTF-8")
56 unit.target = text2.decode('utf-8')
57 unit.addlocation(key + "." + subkey)
58 if getattr(translators_comment, subkey).strip() != "":
59 unit.addnote(getattr(translators_comment, subkey), origin="developer")
60 return unit
61
90
91 - def convertstore(self, theoofile, duplicatestyle="msgctxt"):
92 """converts an entire oo file to a base class format (.po or XLIFF)"""
93 thetargetfile = po.pofile()
94
95 bug_url = 'http://qa.openoffice.org/issues/enter_bug.cgi?%s' % \
96 urlencode({"subcomponent": "ui",
97 "comment": "",
98 "short_desc": "Localization issue in file: %s" % \
99 theoofile.filename,
100 "component": "l10n",
101 "form_name": "enter_issue",
102 })
103 targetheader = thetargetfile.init_headers(charset="UTF-8",
104 encoding="8bit",
105 x_accelerator_marker="~",
106 report_msgid_bugs_to=bug_url)
107 targetheader.addnote("extracted from %s" % theoofile.filename,
108 "developer")
109 thetargetfile.setsourcelanguage(self.sourcelanguage)
110 thetargetfile.settargetlanguage(self.targetlanguage)
111
112 for theoo in theoofile.units:
113 unitlist = self.convertelement(theoo)
114 for unit in unitlist:
115 thetargetfile.addunit(unit)
116 thetargetfile.removeduplicates(duplicatestyle)
117 return thetargetfile
118
119
121 """verifies the commandline options"""
122 if not options.pot and not options.targetlanguage:
123 raise ValueError("You must specify the target language unless generating POT files (-P)")
124
125
126 -def convertoo(inputfile, outputfile, templates, pot=False, sourcelanguage=None, targetlanguage=None, duplicatestyle="msgid_comment", multifilestyle="single"):
127 """reads in stdin using inputstore class, converts using convertorclass, writes to stdout"""
128 inputstore = oo.oofile()
129 if hasattr(inputfile, "filename"):
130 inputfilename = inputfile.filename
131 else:
132 inputfilename = "(input file name not known)"
133 inputstore.filename = inputfilename
134 inputstore.parse(inputfile.read())
135 if not sourcelanguage:
136 testlangtype = targetlanguage or (inputstore and inputstore.languages[0]) or ""
137 if testlangtype.isdigit():
138 sourcelanguage = "01"
139 else:
140 sourcelanguage = "en-US"
141 if not sourcelanguage in inputstore.languages:
142 print >> sys.stderr, "Warning: sourcelanguage '%s' not found in inputfile '%s' (contains %s)" % (sourcelanguage, inputfilename, ", ".join(inputstore.languages))
143 if targetlanguage and targetlanguage not in inputstore.languages:
144 print >> sys.stderr, "Warning: targetlanguage '%s' not found in inputfile '%s' (contains %s)" % (targetlanguage, inputfilename, ", ".join(inputstore.languages))
145 convertor = oo2po(sourcelanguage, targetlanguage, blankmsgstr=pot, long_keys=multifilestyle != "single")
146 outputstore = convertor.convertstore(inputstore, duplicatestyle)
147 if outputstore.isempty():
148 return 0
149 outputfile.write(str(outputstore))
150 return 1
151
152
153 -def main(argv=None):
154 from translate.convert import convert
155 formats = {"oo": ("po", convertoo), "sdf": ("po", convertoo)}
156
157 archiveformats = {(None, "input"): oo.oomultifile}
158 parser = convert.ArchiveConvertOptionParser(formats, usepots=True, description=__doc__, archiveformats=archiveformats)
159 parser.add_option("-l", "--language", dest="targetlanguage", default=None,
160 help="set target language to extract from oo file (e.g. af-ZA)", metavar="LANG")
161 parser.add_option("", "--source-language", dest="sourcelanguage", default=None,
162 help="set source language code (default en-US)", metavar="LANG")
163 parser.add_option("", "--nonrecursiveinput", dest="allowrecursiveinput", default=True, action="store_false", help="don't treat the input oo as a recursive store")
164 parser.add_duplicates_option()
165 parser.add_multifile_option()
166 parser.passthrough.append("pot")
167 parser.passthrough.append("sourcelanguage")
168 parser.passthrough.append("targetlanguage")
169 parser.verifyoptions = verifyoptions
170 parser.run(argv)
171
172
173 if __name__ == '__main__':
174 main()
175