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 developer_notes = unit.getnotes(origin="developer") 47 translator_notes = unit.getnotes(origin="translator") 48 unit.removenotes() 49 unit.addnote(self.convertstrings(developer_notes)) 50 unit.addnote(self.convertstrings(translator_notes)) 51 unit.source = self.convertstrings(unit.source) 52 unit.target = self.convertstrings(unit.target) 53 return unit
54
55 - def convertstring(self, input):
56 return re.sub('%(\d)\$s', lambda x: "{%d}" % (int(x.group(1))-1), input)
57
58 - def convertstrings(self, input):
59 if isinstance(input, multistring): 60 strings = input.strings 61 elif isinstance(input, list): 62 strings = input 63 else: 64 return self.convertstring(input) 65 for index, string in enumerate(strings): 66 strings[index] = re.sub('%(\d)\$s', lambda x: "{%d}" % (int(x.group(1))-1), string) 67 return multistring(strings)
68
69 -def convertphp2py(inputfile, outputfile, template=None):
70 """Converts from PHP .po format to Python .po format 71 72 @param inputfile: file handle of the source 73 @param outputfile: file handle to write to 74 @param template: unused 75 """ 76 convertor = phppo2pypo() 77 inputstore = po.pofile(inputfile) 78 outputstore = convertor.convertstore(inputstore) 79 if outputstore.isempty(): 80 return False 81 outputfile.write(str(outputstore)) 82 return True
83
84 -def main(argv=None):
85 """Converts PHP .po files to Python .po files.""" 86 from translate.convert import convert 87 88 formats = {"po":("po", convertphp2py)} 89 parser = convert.ConvertOptionParser(formats, description=__doc__) 90 parser.run(argv)
91 92 if __name__ == '__main__': 93 main() 94