1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 """convert OpenDocument (ODF) files to Gettext PO localization files"""
24
25 import cStringIO
26 import zipfile
27
28 import lxml.etree as etree
29
30 from translate.storage import factory
31 from translate.storage.xml_extract import unit_tree
32 from translate.storage.xml_extract import extract
33 from translate.storage.xml_extract import generate
34 from translate.storage import odf_shared, odf_io
35
36
38 return unit_node.children.values()[0]
39
40
46
47 def load_unit_tree(input_file, dom_trees):
48 store = factory.getobject(input_file)
49 tree = unit_tree.build_unit_tree(store)
50
51 def extract_unit_tree(filename, root_dom_element_name):
52 """Find the subtree in 'tree' which corresponds to the data in XML file 'filename'"""
53
54 def get_tree():
55 try:
56 return tree.children['office:%s' % root_dom_element_name, 0]
57 except KeyError:
58 return unit_tree.XPathTree()
59 return (filename, get_tree())
60
61 return dict([extract_unit_tree('content.xml', 'document-content'),
62 extract_unit_tree('meta.xml', 'document-meta'),
63 extract_unit_tree('styles.xml', 'document-styles')])
64
65 def translate_dom_trees(unit_trees, dom_trees):
66 make_parse_state = lambda: extract.ParseState(odf_shared.no_translate_content_elements, odf_shared.inline_elements)
67 for filename, dom_tree in dom_trees.iteritems():
68 file_unit_tree = unit_trees[filename]
69 generate.apply_translations(dom_tree.getroot(), file_unit_tree, generate.replace_dom_text(make_parse_state))
70 return dom_trees
71
72
73
74
75 template.close()
76 template = file(template.name, mode='rb')
77 dom_trees = load_dom_trees(template)
78 unit_trees = load_unit_tree(input_file, dom_trees)
79 return translate_dom_trees(unit_trees, dom_trees)
80
81
82 -def write_odf(xlf_data, template, output_file, dom_trees):
83
84 def write_content_to_odf(output_zip, dom_trees):
85 for filename, dom_tree in dom_trees.iteritems():
86 output_zip.writestr(filename, etree.tostring(dom_tree, encoding='UTF-8', xml_declaration=True))
87
88
89
90
91 template.close()
92 template = file(template.name, mode='rb')
93 template_zip = zipfile.ZipFile(template, 'r')
94 output_file.close()
95 output_file = file(output_file.name, mode='wb')
96 output_zip = zipfile.ZipFile(output_file, 'w', compression=zipfile.ZIP_DEFLATED)
97
98
99
100
101
102 output_zip = odf_io.copy_odf(template_zip, output_zip, dom_trees.keys())
103 write_content_to_odf(output_zip, dom_trees)
104
105
107 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout"""
108 xlf_data = input_file.read()
109 dom_trees = translate_odf(template, cStringIO.StringIO(xlf_data))
110 write_odf(xlf_data, template, output_file, dom_trees)
111 output_file.close()
112 return True
113
114 formats = {
115 ('xlf', 'odt'): ("odt", convertxliff),
116 ('xlf', 'ods'): ("ods", convertxliff),
117 ('xlf', 'odp'): ("odp", convertxliff),
118 ('xlf', 'odg'): ("odg", convertxliff),
119 ('xlf', 'odc'): ("odc", convertxliff),
120 ('xlf', 'odf'): ("odf", convertxliff),
121 ('xlf', 'odi'): ("odi", convertxliff),
122 ('xlf', 'odm'): ("odm", convertxliff),
123 ('xlf', 'ott'): ("ott", convertxliff),
124 ('xlf', 'ots'): ("ots", convertxliff),
125 ('xlf', 'otp'): ("otp", convertxliff),
126 ('xlf', 'otg'): ("otg", convertxliff),
127 ('xlf', 'otc'): ("otc", convertxliff),
128 ('xlf', 'otf'): ("otf", convertxliff),
129 ('xlf', 'oti'): ("oti", convertxliff),
130 ('xlf', 'oth'): ("oth", convertxliff),
131 }
132
133
134 -def main(argv=None):
135 from translate.convert import convert
136
137 parser = convert.ConvertOptionParser(formats, usetemplates=True, description=__doc__)
138 parser.run(argv)
139
140
141 if __name__ == '__main__':
142 main()
143