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

Source Code for Module translate.convert.po2xliff

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  # 
  4  # Copyright 2005, 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 Gettext PO localization files to XLIFF localization files 
 24   
 25  see: http://translate.sourceforge.net/wiki/toolkit/po2xliff for examples and  
 26  usage instructions 
 27  """ 
 28   
 29  from translate.storage import po 
 30  from translate.storage import poxliff 
 31   
32 -class po2xliff:
33 - def convertunit(self, outputstore, inputunit, filename):
34 """creates a transunit node""" 35 source = inputunit.source 36 target = inputunit.target 37 if inputunit.isheader(): 38 unit = outputstore.addheaderunit(target, filename) 39 else: 40 unit = outputstore.addsourceunit(source, filename, True) 41 unit.target = target 42 #Explicitly marking the fuzzy state will ensure that normal (translated) 43 #units in the PO file end up as approved in the XLIFF file. 44 if target: 45 unit.markfuzzy(inputunit.isfuzzy()) 46 else: 47 unit.markapproved(False) 48 49 #Handle #: location comments 50 for location in inputunit.getlocations(): 51 unit.createcontextgroup("po-reference", self.contextlist(location), purpose="location") 52 53 #Handle #. automatic comments 54 comment = inputunit.getnotes("developer") 55 if comment: 56 unit.createcontextgroup("po-entry", [("x-po-autocomment", comment)], purpose="information") 57 unit.addnote(comment, origin="developer") 58 59 #TODO: x-format, etc. 60 61 62 #Handle # other comments 63 comment = inputunit.getnotes("translator") 64 if comment: 65 unit.createcontextgroup("po-entry", [("x-po-trancomment", comment)], purpose="information") 66 unit.addnote(comment, origin="po-translator") 67 68 return unit
69
70 - def contextlist(self, location):
71 contexts = [] 72 if ":" in location: 73 sourcefile, linenumber = location.split(":", 1) 74 else: 75 sourcefile, linenumber = location, None 76 contexts.append(("sourcefile", sourcefile)) 77 if linenumber: 78 contexts.append(("linenumber", linenumber)) 79 return contexts
80
81 - def convertstore(self, inputstore, templatefile=None, **kwargs):
82 """converts a .po file to .xlf format""" 83 if templatefile is None: 84 outputstore = poxliff.PoXliffFile(**kwargs) 85 else: 86 outputstore = poxliff.PoXliffFile(templatefile, **kwargs) 87 filename = inputstore.filename 88 for inputunit in inputstore.units: 89 if inputunit.isblank(): 90 continue 91 transunitnode = self.convertunit(outputstore, inputunit, filename) 92 return str(outputstore)
93
94 -def convertpo(inputfile, outputfile, templatefile):
95 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout""" 96 inputstore = po.pofile(inputfile) 97 if inputstore.isempty(): 98 return 0 99 convertor = po2xliff() 100 outputstring = convertor.convertstore(inputstore, templatefile) 101 outputfile.write(outputstring) 102 return 1
103
104 -def main(argv=None):
105 from translate.convert import convert 106 formats = {"po": ("xlf", convertpo), ("po", "xlf"): ("xlf", convertpo)} 107 parser = convert.ConvertOptionParser(formats, usepots=True, usetemplates=True, description=__doc__) 108 parser.run(argv)
109 110 if __name__ == '__main__': 111 main() 112