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