Package translate :: Package convert :: Module xliff2odf
[hide private]
[frames] | no frames]

Source Code for Module translate.convert.xliff2odf

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  # 
  4  # Copyright 2004-2006 Zuza Software Foundation 
  5  #  
  6  # This file is part of translate. 
  7  # 
  8  # translate is free software; you can redistribute it and/or modify 
  9  # it under the terms of the GNU General Public License as published by 
 10  # the Free Software Foundation; either version 2 of the License, or 
 11  # (at your option) any later version. 
 12  #  
 13  # translate is distributed in the hope that it will be useful, 
 14  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  # GNU General Public License for more details. 
 17  # 
 18  # You should have received a copy of the GNU General Public License 
 19  # along with translate; if not, write to the Free Software 
 20  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 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   
37 -def first_child(unit_node):
38 return unit_node.children.values()[0]
39
40 -def translate_odf(template, input_file):
41 def load_dom_trees(template): 42 odf_data = odf_io.open_odf(template) 43 return dict((filename, etree.parse(cStringIO.StringIO(data))) for filename, data in odf_data.iteritems())
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 # Since the convertoptionsparser will give us an open file, we risk that 70 # it could have been opened in non-binary mode on Windows, and then we'll 71 # have problems, so let's make sure we have what we want. 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 # Since the convertoptionsparser will give us an open file, we risk that 84 # it could have been opened in non-binary mode on Windows, and then we'll 85 # have problems, so let's make sure we have what we want. 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
94 -def convertxliff(input_file, output_file, template):
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), # Text 105 "xlf": ("ods", convertxliff), # Spreadsheet 106 "xlf": ("odp", convertxliff), # Presentation 107 "xlf": ("odg", convertxliff), # Drawing 108 "xlf": ("odc", convertxliff), # Chart 109 "xlf": ("odf", convertxliff), # Formula 110 "xlf": ("odi", convertxliff), # Image 111 "xlf": ("odm", convertxliff), # Master Document 112 "xlf": ("ott", convertxliff), # Text template 113 "xlf": ("ots", convertxliff), # Spreadsheet template 114 "xlf": ("otp", convertxliff), # Presentation template 115 "xlf": ("otg", convertxliff), # Drawing template 116 "xlf": ("otc", convertxliff), # Chart template 117 "xlf": ("otf", convertxliff), # Formula template 118 "xlf": ("oti", convertxliff), # Image template 119 "xlf": ("oth", convertxliff), # Web page template 120 } 121 122 parser = convert.ConvertOptionParser(formats, usetemplates=True, description=__doc__) 123 parser.run(argv)
124 125 if __name__ == '__main__': 126 main() 127