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