| OLD | NEW |
|---|---|
| 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 | |
| 49 #Handle msgctxt | |
| 50 context = inputunit.getcontext() | |
| 51 if context: | |
| 52 unit.createcontextgroup("po-1025", [("x-unknown", context)], | |
|
georgeyk
2008/07/24 05:14:28
I think this should be done though a method. So we
| |
| 53 purpose="match information") | |
| 48 | 54 |
| 49 #Handle #: location comments | 55 #Handle #: location comments |
| 50 for location in inputunit.getlocations(): | 56 for location in inputunit.getlocations(): |
| 51 unit.createcontextgroup("po-reference", self.contextlist(locatio n), purpose="location") | 57 unit.createcontextgroup("po-reference", self.contextlist(locatio n), purpose="location") |
| 52 | 58 |
| 53 #Handle #. automatic comments | 59 #Handle #. automatic comments |
| 54 comment = inputunit.getnotes("developer") | 60 comment = inputunit.getnotes("developer") |
| 55 if comment: | 61 if comment: |
| 56 unit.createcontextgroup("po-entry", [("x-po-autocomment", commen t)], purpose="information") | 62 unit.createcontextgroup("po-entry", [("x-po-autocomment", commen t)], purpose="information") |
| 57 unit.addnote(comment, origin="developer") | 63 unit.addnote(comment, origin="developer") |
| 58 | 64 |
| 59 #TODO: x-format, etc. | 65 #TODO: x-format, etc. |
| 60 | 66 |
| 61 | 67 |
| 62 #Handle # other comments | 68 #Handle # other comments |
| 63 comment = inputunit.getnotes("translator") | 69 comment = inputunit.getnotes("translator") |
| 64 if comment: | 70 if comment: |
| 65 unit.createcontextgroup("po-entry", [("x-po-trancomment", comment)], purpose="information") | 71 unit.createcontextgroup("po-entry", [("x-po-trancomment", comment)], purpose="information") |
| 66 unit.addnote(comment, origin="po-translator") | 72 unit.addnote(comment, origin="po-translator") |
| 67 | 73 |
| 68 return unit | 74 return unit |
| 69 | 75 |
| 70 def contextlist(self, location): | 76 def contextlist(self, location): |
| 71 contexts = [] | 77 contexts = [] |
| 72 if ":" in location: | 78 if ":" in location: |
| 73 sourcefile, linenumber = location.split(":", 1) | 79 sourcefile, linenumber = location.split(":", 1) |
| 74 else: | 80 else: |
| 75 sourcefile, linenumber = location, None | 81 sourcefile, linenumber = location, None |
| 76 contexts.append(("sourcefile", sourcefile)) | 82 contexts.append(("sourcefile", sourcefile)) |
| 77 if linenumber: | 83 if linenumber: |
| 78 contexts.append(("linenumber", linenumber)) | 84 contexts.append(("linenumber", linenumber)) |
| 79 return contexts | 85 return contexts |
| 80 | 86 |
| 81 def convertstore(self, inputstore, templatefile=None, **kwargs): | 87 def convertstore(self, inputstore, templatefile=None, **kwargs): |
| 82 """converts a .po file to .xlf format""" | 88 """converts a .po file to .xlf format""" |
| 83 if templatefile is None: | 89 if templatefile is None: |
| 84 outputstore = poxliff.PoXliffFile(**kwargs) | 90 outputstore = poxliff.PoXliffFile(**kwargs) |
| 85 else: | 91 else: |
| 86 outputstore = poxliff.PoXliffFile(templatefile, **kwargs) | 92 outputstore = poxliff.PoXliffFile(templatefile, **kwargs) |
| 87 filename = inputstore.filename | 93 filename = inputstore.filename |
| 88 for inputunit in inputstore.units: | 94 for inputunit in inputstore.units: |
| 89 if inputunit.isblank(): | 95 if inputunit.isblank(): |
| 90 continue | 96 continue |
| 91 transunitnode = self.convertunit(outputstore, inputunit, filename) | 97 transunitnode = self.convertunit(outputstore, inputunit, filename) |
| 92 return str(outputstore) | 98 return str(outputstore) |
| 93 | 99 |
| 94 def convertpo(inputfile, outputfile, templatefile): | 100 def convertpo(inputfile, outputfile, templatefile): |
| 95 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout""" | 101 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout""" |
| 96 inputstore = po.pofile(inputfile) | 102 inputstore = po.pofile(inputfile) |
| 97 if inputstore.isempty(): | 103 if inputstore.isempty(): |
| 98 return 0 | 104 return 0 |
| 99 convertor = po2xliff() | 105 convertor = po2xliff() |
| 100 outputstring = convertor.convertstore(inputstore, templatefile) | 106 outputstring = convertor.convertstore(inputstore, templatefile) |
| 101 outputfile.write(outputstring) | 107 outputfile.write(outputstring) |
| 102 return 1 | 108 return 1 |
| 103 | 109 |
| 104 def main(argv=None): | 110 def main(argv=None): |
| 105 from translate.convert import convert | 111 from translate.convert import convert |
| 106 formats = {"po": ("xlf", convertpo), ("po", "xlf"): ("xlf", convertpo)} | 112 formats = {"po": ("xlf", convertpo), ("po", "xlf"): ("xlf", convertpo)} |
| 107 parser = convert.ConvertOptionParser(formats, usepots=True, usetemplates=Tru e, description=__doc__) | 113 parser = convert.ConvertOptionParser(formats, usepots=True, usetemplates=Tru e, description=__doc__) |
| 108 parser.run(argv) | 114 parser.run(argv) |
| 109 | 115 |
| 110 if __name__ == '__main__': | 116 if __name__ == '__main__': |
| 111 main() | 117 main() |
| OLD | NEW |