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
37 return unit_node.children.values()[0]
38
43
44 def load_unit_tree(input_file, dom_trees):
45 store = factory.getobject(input_file)
46 tree = unit_tree.build_unit_tree(store)
47
48 def extract_unit_tree(filename, root_dom_element_name):
49 """Find the subtree in 'tree' which corresponds to the data in XML file 'filename'"""
50 def get_tree():
51 try:
52 return tree.children['office:%s' % root_dom_element_name, 0]
53 except KeyError:
54 return unit_tree.XPathTree()
55 return (filename, get_tree())
56
57 return dict([extract_unit_tree('content.xml', 'document-content'),
58 extract_unit_tree('meta.xml', 'document-meta'),
59 extract_unit_tree('styles.xml', 'document-styles')])
60
61 def translate_dom_trees(unit_trees, dom_trees):
62 make_parse_state = lambda: extract.ParseState(odf_shared.no_translate_content_elements, odf_shared.inline_elements)
63 for filename, dom_tree in dom_trees.iteritems():
64 file_unit_tree = unit_trees[filename]
65 generate.apply_translations(dom_tree.getroot(), file_unit_tree, generate.replace_dom_text(make_parse_state))
66 return dom_trees
67
68
69
70
71 template.close()
72 template = file(template.name, mode='rb')
73 dom_trees = load_dom_trees(template)
74 unit_trees = load_unit_tree(input_file, dom_trees)
75 return translate_dom_trees(unit_trees, dom_trees)
76
77 -def write_odf(xlf_data, template, output_file, dom_trees):
78 def write_content_to_odf(output_zip, dom_trees):
79 for filename, dom_tree in dom_trees.iteritems():
80 output_zip.writestr(filename, etree.tostring(dom_tree, encoding='UTF-8', xml_declaration=True))
81
82
83
84
85 template.close()
86 template = file(template.name, mode='rb')
87 template_zip = zipfile.ZipFile(template, 'r')
88 output_file.close()
89 output_file = file(output_file.name, mode='wb')
90 output_zip = zipfile.ZipFile(output_file, 'w', compression=zipfile.ZIP_DEFLATED)
91
92
93
94
95
96 output_zip = odf_io.copy_odf(template_zip, output_zip, dom_trees.keys())
97 write_content_to_odf(output_zip, dom_trees)
98
100 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout"""
101 xlf_data = input_file.read()
102 dom_trees = translate_odf(template, cStringIO.StringIO(xlf_data))
103 write_odf(xlf_data, template, output_file, dom_trees)
104 output_file.close()
105 return True
106
107 formats = {
108 ('xlf', 'odt'): ("odt", convertxliff),
109 ('xlf', 'ods'): ("ods", convertxliff),
110 ('xlf', 'odp'): ("odp", convertxliff),
111 ('xlf', 'odg'): ("odg", convertxliff),
112 ('xlf', 'odc'): ("odc", convertxliff),
113 ('xlf', 'odf'): ("odf", convertxliff),
114 ('xlf', 'odi'): ("odi", convertxliff),
115 ('xlf', 'odm'): ("odm", convertxliff),
116 ('xlf', 'ott'): ("ott", convertxliff),
117 ('xlf', 'ots'): ("ots", convertxliff),
118 ('xlf', 'otp'): ("otp", convertxliff),
119 ('xlf', 'otg'): ("otg", convertxliff),
120 ('xlf', 'otc'): ("otc", convertxliff),
121 ('xlf', 'otf'): ("otf", convertxliff),
122 ('xlf', 'oti'): ("oti", convertxliff),
123 ('xlf', 'oth'): ("oth", convertxliff),
124 }
125
126 -def main(argv=None):
127 from translate.convert import convert
128
129 parser = convert.ConvertOptionParser(formats, usetemplates=True, description=__doc__)
130 parser.run(argv)
131
132 if __name__ == '__main__':
133 main()
134