Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(104)

Delta Between Two Patch Sets: translate/convert/po2xliff.py

Issue 65: xliff2po & po2xliff should handle context SVN Base: https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/
Left Patch Set: Added "id's" to context-group names Created 1 year, 4 months ago
Right Patch Set: A more complete patch, supporting CPO and pypo Created 1 year, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: View regular side by side diff
Right: View regular side by side diff
LEFTRIGHT
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 # 3 #
4 # Copyright 2005, 2006 Zuza Software Foundation 4 # Copyright 2005, 2006 Zuza Software Foundation
5 # 5 #
6 # This file is part of translate. 6 # This file is part of translate.
7 # 7 #
8 # translate is free software; you can redistribute it and/or modify 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 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 10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version. 11 # (at your option) any later version.
12 # 12 #
13 # translate is distributed in the hope that it will be useful, 13 # translate is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details. 16 # GNU General Public License for more details.
17 # 17 #
18 # You should have received a copy of the GNU General Public License 18 # You should have received a copy of the GNU General Public License
19 # along with translate; if not, write to the Free Software 19 # along with translate; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 # 21 #
22 22
23 """convert Gettext PO localization files to XLIFF localization files 23 """convert Gettext PO localization files to XLIFF localization files
24 24
25 see: http://translate.sourceforge.net/wiki/toolkit/po2xliff for examples and 25 see: http://translate.sourceforge.net/wiki/toolkit/po2xliff for examples and
26 usage instructions 26 usage instructions
27 """ 27 """
28 28
29 from translate.storage import po 29 from translate.storage import po
30 from translate.storage import poxliff 30 from translate.storage import poxliff
31 31
32 class po2xliff: 32 class po2xliff:
33 def convertunit(self, outputstore, inputunit, filename): 33 def convertunit(self, outputstore, inputunit, filename):
34 """creates a transunit node""" 34 """creates a transunit node"""
35 source = inputunit.source 35 source = inputunit.source
36 target = inputunit.target 36 target = inputunit.target
37 if inputunit.isheader(): 37 if inputunit.isheader():
38 unit = outputstore.addheaderunit(target, filename) 38 unit = outputstore.addheaderunit(target, filename)
39 else: 39 else:
40 unit = outputstore.addsourceunit(source, filename, True) 40 unit = outputstore.addsourceunit(source, filename, True)
41 unit.target = target 41 unit.target = target
42 #Explicitly marking the fuzzy state will ensure that normal (transla ted) 42 #Explicitly marking the fuzzy state will ensure that normal (transla ted)
43 #units in the PO file end up as approved in the XLIFF file. 43 #units in the PO file end up as approved in the XLIFF file.
44 if target: 44 if target:
45 unit.markfuzzy(inputunit.isfuzzy()) 45 unit.markfuzzy(inputunit.isfuzzy())
46 else: 46 else:
47 unit.markapproved(False) 47 unit.markapproved(False)
48 48
49 #Handle msgctxt 49 #Handle msgctxt
50 context = inputunit.getcontext() 50 context = inputunit.getcontext()
51 if context: 51 if context:
52 unit.setcontext_message(context) 52 unit.setcontext_message(context)
53 53
54 #Handle #: location comments 54 #Handle #: location comments
55 for location in inputunit.getlocations(): 55 for location in inputunit.getlocations():
56 unit.createcontextgroup("po-reference", self.contextlist(locatio n), purpose="location") 56 unit.createcontextgroup("po-reference", self.contextlist(locatio n), purpose="location")
57 57
58 #Handle #. automatic comments 58 #Handle #. automatic comments
59 comment = inputunit.getnotes("developer") 59 comment = inputunit.getnotes("developer")
60 if comment: 60 if comment:
61 unit.createcontextgroup("po-entry", [("x-po-autocomment", commen t)], purpose="information") 61 unit.createcontextgroup("po-entry", [("x-po-autocomment", commen t)], purpose="information")
62 unit.addnote(comment, origin="developer") 62 unit.addnote(comment, origin="developer")
63 63
64 #TODO: x-format, etc. 64 #TODO: x-format, etc.
65 65
66 66
67 #Handle # other comments 67 #Handle # other comments
68 comment = inputunit.getnotes("translator") 68 comment = inputunit.getnotes("translator")
69 if comment: 69 if comment:
70 unit.createcontextgroup("po-entry", [("x-po-trancomment", comment)], purpose="information") 70 unit.createcontextgroup("po-entry", [("x-po-trancomment", comment)], purpose="information")
71 unit.addnote(comment, origin="po-translator") 71 unit.addnote(comment, origin="po-translator")
72 72
73 return unit 73 return unit
74 74
75 def contextlist(self, location): 75 def contextlist(self, location):
76 contexts = [] 76 contexts = []
77 if ":" in location: 77 if ":" in location:
78 sourcefile, linenumber = location.split(":", 1) 78 sourcefile, linenumber = location.split(":", 1)
79 else: 79 else:
80 sourcefile, linenumber = location, None 80 sourcefile, linenumber = location, None
81 contexts.append(("sourcefile", sourcefile)) 81 contexts.append(("sourcefile", sourcefile))
82 if linenumber: 82 if linenumber:
83 contexts.append(("linenumber", linenumber)) 83 contexts.append(("linenumber", linenumber))
84 return contexts 84 return contexts
85 85
86 def convertstore(self, inputstore, templatefile=None, **kwargs): 86 def convertstore(self, inputstore, templatefile=None, **kwargs):
87 """converts a .po file to .xlf format""" 87 """converts a .po file to .xlf format"""
88 if templatefile is None: 88 if templatefile is None:
89 outputstore = poxliff.PoXliffFile(**kwargs) 89 outputstore = poxliff.PoXliffFile(**kwargs)
90 else: 90 else:
91 outputstore = poxliff.PoXliffFile(templatefile, **kwargs) 91 outputstore = poxliff.PoXliffFile(templatefile, **kwargs)
92 filename = inputstore.filename 92 filename = inputstore.filename
93 for inputunit in inputstore.units: 93 for inputunit in inputstore.units:
94 if inputunit.isblank(): 94 if inputunit.isblank():
95 continue 95 continue
96 transunitnode = self.convertunit(outputstore, inputunit, filename) 96 transunitnode = self.convertunit(outputstore, inputunit, filename)
97 return str(outputstore) 97 return str(outputstore)
98 98
99 def convertpo(inputfile, outputfile, templatefile): 99 def convertpo(inputfile, outputfile, templatefile):
100 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout""" 100 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout"""
101 inputstore = po.pofile(inputfile) 101 inputstore = po.pofile(inputfile)
102 if inputstore.isempty(): 102 if inputstore.isempty():
103 return 0 103 return 0
104 convertor = po2xliff() 104 convertor = po2xliff()
105 outputstring = convertor.convertstore(inputstore, templatefile) 105 outputstring = convertor.convertstore(inputstore, templatefile)
106 outputfile.write(outputstring) 106 outputfile.write(outputstring)
107 return 1 107 return 1
108 108
109 def main(argv=None): 109 def main(argv=None):
110 from translate.convert import convert 110 from translate.convert import convert
111 formats = {"po": ("xlf", convertpo), ("po", "xlf"): ("xlf", convertpo)} 111 formats = {"po": ("xlf", convertpo), ("po", "xlf"): ("xlf", convertpo)}
112 parser = convert.ConvertOptionParser(formats, usepots=True, usetemplates=Tru e, description=__doc__) 112 parser = convert.ConvertOptionParser(formats, usepots=True, usetemplates=Tru e, description=__doc__)
113 parser.run(argv) 113 parser.run(argv)
114 114
115 if __name__ == '__main__': 115 if __name__ == '__main__':
116 main() 116 main()
LEFTRIGHT

Powered by Google App Engine
This is Rietveld r159