Package translate :: Package tools :: Module phppo2pypo

[hide private]
[frames] | no frames]

# Source Code for Module translate.tools.phppo2pypo

     1  #!/usr/bin/env python
     2  # -*- coding: utf-8 -*-
     3  #
     4  # Copyright 2009 Mozilla Corporation, 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  """ Convert PHP format .po files to Python format .po files """
    23
    24  import re
    25  from translate.storage import po
    26  from translate.misc.multistring import multistring
    27
    28 -class phppo2pypo:
    29 -    def convertstore(self, inputstore):
    30          """Converts a given .po file (PHP Format) to a Python format .po file, the difference being
    31              how variable substitutions work.  PHP uses a %1$s format, and Python uses
    32              a {0} format (zero indexed).  This method will convert, e.g.:
    33                  I have %2$s apples and %1$s oranges
    34                      to
    35                  I have {1} apples and {0} oranges
    36              This method ignores strings with %s as both languages will recognize that.
    37          """
    38          thetargetfile = po.pofile(inputfile="")
    39
    40          for unit in inputstore.units:
    41              newunit = self.convertunit(unit)
    42              thetargetfile.addunit(newunit)
    43          return thetargetfile
    44
    45 -    def convertunit(self, unit):
    46          unit.automaticcomments = self.convertstrings(unit.automaticcomments)
    47          unit.othercomments = self.convertstrings(unit.othercomments)
    48          unit.source = self.convertstrings(unit.source)
    49          unit.target = self.convertstrings(unit.target)
    50          return unit
    51
    52 -    def convertstrings(self, input):
    53          if isinstance(input, multistring):
    54              strings = input.strings
    55          elif isinstance(input, list):
    56              strings = input
    57          else:
    58              strings = [input]
    59
    60          for index, string in enumerate(strings):
    61              strings[index] = re.sub('%(\d)\$s', lambda x: "{%d}" % (int(x.group(1))-1), string)
    62          if len(strings) == 1:
    63              return strings[0]
    64          else:
    65              return strings
    66
    67 -def convertphp2py(inputfile, outputfile, template=None):
    68      """Converts from PHP .po format to Python .po format
    69
    70      @param inputfile: file handle of the source
    71      @param outputfile: file handle to write to
    72      @param template: unused
    73      """
    74      convertor = phppo2pypo()
    75      inputstore = po.pofile(inputfile)
    76      outputstore = convertor.convertstore(inputstore)
    77      if outputstore.isempty():
    78          return False
    79      outputfile.write(str(outputstore))
    80      return True
    81
    82 -def main(argv=None):
    83      """Converts PHP .po files to Python .po files."""
    84      from translate.convert import convert
    85
    86      formats = {"po":("po", convertphp2py)}
    87      parser = convert.ConvertOptionParser(formats, description=__doc__)
    88      parser.run(argv)
    89
    90  if __name__ == '__main__':
    91      main()
    92