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