Package translate :: Package tools :: Module pomerge

[hide private]
[frames] | no frames]

# Source Code for Module translate.tools.pomerge

      1  #!/usr/bin/env python
      2  # -*- coding: utf-8 -*-
      3  #
      4  # Copyright 2002-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  """Merges XLIFF and Gettext PO localization files
     23
     24  Snippet file produced by pogrep or updated by a translator can be merged into
     25  existing files
     26
     27  See: http://translate.sourceforge.net/wiki/toolkit/pomerge for examples and
     28  usage instructions
     29  """
     30
     31  import sys
     32  from translate.storage import factory
     33  from translate.storage.poheader import poheader
     34
     35 -def mergestores(store1, store2, mergeblanks, mergecomments):
     36      """Take any new translations in store2 and write them into store1."""
     37
     38      for unit2 in store2.units:
     39          if unit2.isheader():
     40              if isinstance(store1, poheader):
     41                  store1.mergeheaders(store2)
     42              # Skip header units
     43              continue
     44          # there may be more than one entity due to msguniq merge
     45          entities = unit2.getlocations()
     46          if len(entities) == 0:
     47              source = unit2.source
     48              unit1 = store1.findunit(source)
     49              if unit1 is None:
     50                  sys.stderr.write(str(unit2) + "\n")
     51              else:
     52                  # finally set the new definition in unit1
     53                  unit1.merge(unit2, overwrite=True)
     54          for entity in entities:
     55              unit1 = None
     56              if store1.locationindex.has_key(entity):
     57                  # now we need to replace the definition of entity with msgstr
     58                  unit1 = store1.locationindex[entity] # find the other po
     59              # check if this is a duplicate in store2...
     60              if store2.locationindex.has_key(entity):
     61                  if store2.locationindex[entity] is None:
     62                      unit1 = None
     63              # if locationindex was not unique, use the source index
     64              if unit1 is None:
     65                  source = unit2.source
     66                  unit1 = store1.findunit(source)
     67              # check if we found a matching po element
     68              if unit1 is None:
     69                  print >> sys.stderr, "# the following po element was not found"
     70                  sys.stderr.write(str(unit2) + "\n")
     71              else:
     72                  if not mergeblanks:
     73                      target = unit2.target
     74                      if len(target.strip()) == 0:
     75                          continue
     76                  # finally set the new definition in unit1
     77                  unit1.merge(unit2, overwrite=True, comments=mergecomments)
     78      return store1
     79
     80 -def str2bool(option):
     81      """Convert a string value to boolean
     82
     83      @param option: yes, true, 1, no, false, 0
     84      @type option: String
     85      @rtype: Boolean
     86
     87      """
     88      option = option.lower()
     89      if option in ("yes", "true", "1"):
     90          return True
     91      elif option in ("no", "false", "0"):
     92          return False
     93      else:
     94          raise ValueError("invalid boolean value: %r" % option)
     95
     96 -def mergestore(inputfile, outputfile, templatefile, mergeblanks="no", mergecomments="yes"):
     97      try:
     98          mergecomments = str2bool(mergecomments)
     99      except ValueError:
    100          raise ValueError("invalid mergecomments value: %r" % mergecomments)
    101      try:
    102          mergeblanks = str2bool(mergeblanks)
    103      except ValueError:
    104          raise ValueError("invalid mergeblanks value: %r" % mergeblanks)
    105      inputstore = factory.getobject(inputfile)
    106      if templatefile is None:
    107          # just merge nothing
    108          templatestore = type(inputstore)()
    109      else:
    110          templatestore = factory.getobject(templatefile)
    111      templatestore.makeindex()
    112      inputstore.makeindex()
    113      outputstore = mergestores(templatestore, inputstore, mergeblanks, mergecomments)
    114      if outputstore.isempty():
    115          return 0
    116      outputfile.write(str(outputstore))
    117      return 1
    118
    119 -def main():
    120      from translate.convert import convert
    121      pooutput = ("po", mergestore)
    122      potoutput = ("pot", mergestore)
    123      xliffoutput = ("xlf", mergestore)
    124      formats = {("po", "po"): pooutput, ("po", "pot"): pooutput, ("pot", "po"): pooutput, ("pot", "pot"): potoutput,
    125                  "po": pooutput, "pot": pooutput,
    126                  ("xlf", "po"): pooutput, ("xlf", "pot"): pooutput,
    127                  ("xlf", "xlf"): xliffoutput, ("po", "xlf"): xliffoutput}
    128      mergeblanksoption = convert.optparse.Option("", "--mergeblanks", dest="mergeblanks",
    129          action="store", default="yes", help="whether to overwrite existing translations with blank translations (yes/no). Default is yes.")
    130      mergecommentsoption = convert.optparse.Option("", "--mergecomments", dest="mergecomments",
    131          action="store", default="yes", help="whether to merge comments as well as translations (yes/no). Default is yes.")
    132      parser = convert.ConvertOptionParser(formats, usetemplates=True, description=__doc__)
    133      parser.add_option(mergeblanksoption)
    134      parser.passthrough.append("mergeblanks")
    135      parser.add_option(mergecommentsoption)
    136      parser.passthrough.append("mergecomments")
    137      parser.run()
    138
    139
    140  if __name__ == '__main__':
    141      main()
    142