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_zip = zipfile.ZipFile(output_file, 'w', compression=zipfile.ZIP_DEFLATED)
90 output_zip = odf_io.copy_odf(template_zip, output_zip, dom_trees.keys() + ['META-INF/manifest.xml'])
91 output_zip = odf_io.add_file(output_zip, template_zip.read('META-INF/manifest.xml'), 'translation.xlf', xlf_data)
92 write_content_to_odf(output_zip, dom_trees)
93
95 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout"""
96 xlf_data = input_file.read()
97 dom_trees = translate_odf(template, cStringIO.StringIO(xlf_data))
98 write_odf(xlf_data, template, output_file, dom_trees)
99 output_file.close()
100 return True
101
102 -def main(argv=None):
103 from translate.convert import convert
104 formats = {"xlf": ("odt", convertxliff),
105 "xlf": ("ods", convertxliff),
106 "xlf": ("odp", convertxliff),
107 "xlf": ("odg", convertxliff),
108 "xlf": ("odc", convertxliff),
109 "xlf": ("odf", convertxliff),
110 "xlf": ("odi", convertxliff),
111 "xlf": ("odm", convertxliff),
112 "xlf": ("ott", convertxliff),
113 "xlf": ("ots", convertxliff),
114 "xlf": ("otp", convertxliff),
115 "xlf": ("otg", convertxliff),
116 "xlf": ("otc", convertxliff),
117 "xlf": ("otf", convertxliff),
118 "xlf": ("oti", convertxliff),
119 "xlf": ("oth", convertxliff),
120 }
121
122 parser = convert.ConvertOptionParser(formats, usetemplates=True, description=__doc__)
123 parser.run(argv)
124
125 if __name__ == '__main__':
126 main()
127