Package translate :: Package tools :: Module poswap

[hide private]
[frames] | no frames]

# Source Code for Module translate.tools.poswap

      1  #!/usr/bin/env python
      2  # -*- coding: utf-8 -*-
      3  #
      4  # Copyright 2007 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  """Builds a new translation file with the target of the input language as
     23  source language.
     24
     25  Ensure that the two po files correspond 100% to the same pot file before using
     26  this.
     27
     28  To translate Kurdish (ku) through French:
     29      po2swap -i fr/ -t ku -o fr-ku
     30
     31  To convert the fr-ku files back to en-ku:
     32      po2swap --reverse -i fr/ -t fr-ku -o en-ku
     33
     34  See: http://translate.sourceforge.net/wiki/toolkit/poswap for further examples and
     35  usage instructions
     36  """
     37
     38  from translate.storage import po
     39  from translate.convert import convert
     40
     41 -def swapdir(store):
     42      """Swap the source and target of each unit."""
     43      for unit in store.units:
     44          if unit.isheader():
     45              continue
     46          if not unit.target or unit.isfuzzy():
     47              unit.target = unit.source
     48          else:
     49              unit.source, unit.target = unit.target, unit.source
     50
     51 -def convertpo(inputpofile, outputpotfile, template, reverse=False):
     52      """reads in inputpofile, removes the header, writes to outputpotfile."""
     53      inputpo = po.pofile(inputpofile)
     54      templatepo = po.pofile(template)
     55      if reverse:
     56          swapdir(inputpo)
     57      templatepo.makeindex()
     58      header = inputpo.header()
     59      if header:
     60          inputpo.units = inputpo.units[1:]
     61
     62      for i, unit in enumerate(inputpo.units):
     63          for location in unit.getlocations():
     64              templateunit = templatepo.locationindex.get(location, None)
     65              if templateunit and templateunit.source == unit.source:
     66                  break
     67          else:
     68              templateunit = templatepo.findunit(unit.source)
     69
     70          unit.othercomments = []
     71          if unit.target and not unit.isfuzzy():
     72              unit.source = unit.target
     73          elif not reverse:
     74              if inputpo.filename:
     75                  unit.addnote("No translation found in %s" % inputpo.filename, origin="programmer")
     76              else:
     77                  unit.addnote("No translation found in the supplied source language", origin="programmer")
     78          unit.target = ""
     79          unit.markfuzzy(False)
     80          if templateunit:
     81              unit.addnote(templateunit.getnotes(origin="translator"))
     82              unit.markfuzzy(templateunit.isfuzzy())
     83              unit.target = templateunit.target
     84          if unit.isobsolete():
     85              del inputpo.units[i]
     86      outputpotfile.write(str(inputpo))
     87      return 1
     88
     89 -def main(argv=None):
     90      formats = {("po", "po"): ("po", convertpo), ("po", "pot"): ("po", convertpo), "po": ("po", convertpo)}
     91      parser = convert.ConvertOptionParser(formats, usetemplates=True, description=__doc__)
     92      parser.add_option("", "--reverse", dest="reverse", default=False, action="store_true",
     93                      help="reverse the process of intermediate language conversion")
     94      parser.passthrough.append("reverse")
     95      parser.run(argv)
     96
     97  if __name__ == '__main__':
     98      main()
     99