fix git support for v1.5.3 (or higher) by setting "--work-tree"
[translate_toolkit.git] / convert / po2txt.py
blob3ec6353fec37c5987a86428b4c94dc808a196bf4
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
4 # Copyright 2004-2006 Zuza Software Foundation
5 #
6 # This file is part of translate.
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.
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.
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
23 """convert Gettext PO localization files to plain text (.txt) files
25 see: http://translate.sourceforge.net/wiki/toolkit/po2txt for examples and
26 usage instructions
27 """
29 from translate.storage import factory
30 try:
31 import textwrap
32 except:
33 textwrap = None
35 class po2txt:
36 """po2txt can take a po file and generate txt. best to give it a template file otherwise will just concat msgstrs"""
37 def __init__(self, wrap=None):
38 self.wrap = wrap
40 def wrapmessage(self, message):
41 """rewraps text as required"""
42 if self.wrap is None:
43 return message
44 return "\n".join([textwrap.fill(line, self.wrap, replace_whitespace=False) for line in message.split("\n")])
46 def convertstore(self, inputstore, includefuzzy):
47 """converts a file to txt format"""
48 txtresult = ""
49 for unit in inputstore.units:
50 if unit.isheader():
51 continue
52 if unit.istranslated() or (includefuzzy and unit.isfuzzy()):
53 txtresult += self.wrapmessage(unit.target) + "\n" + "\n"
54 else:
55 txtresult += self.wrapmessage(unit.source) + "\n" + "\n"
56 return txtresult.rstrip()
58 def mergestore(self, inputstore, templatetext, includefuzzy):
59 """converts a file to txt format"""
60 txtresult = templatetext
61 # TODO: make a list of blocks of text and translate them individually
62 # rather than using replace
63 for unit in inputstore.units:
64 if unit.isheader():
65 continue
66 if not unit.isfuzzy() or includefuzzy:
67 txtsource = unit.source
68 txttarget = self.wrapmessage(unit.target)
69 if unit.istranslated():
70 txtresult = txtresult.replace(txtsource, txttarget)
71 return txtresult
73 def converttxt(inputfile, outputfile, templatefile, wrap=None, includefuzzy=False, encoding='utf-8'):
74 """reads in stdin using fromfileclass, converts using convertorclass, writes to stdout"""
75 inputstore = factory.getobject(inputfile)
76 convertor = po2txt(wrap=wrap)
77 if templatefile is None:
78 outputstring = convertor.convertstore(inputstore, includefuzzy)
79 else:
80 templatestring = templatefile.read().decode(encoding)
81 outputstring = convertor.mergestore(inputstore, templatestring, includefuzzy)
82 outputfile.write(outputstring.encode('utf-8'))
83 return 1
85 def main(argv=None):
86 from translate.convert import convert
87 from translate.misc import stdiotell
88 import sys
89 sys.stdout = stdiotell.StdIOWrapper(sys.stdout)
90 formats = {("po", "txt"):("txt", converttxt), ("po"):("txt", converttxt), ("xlf", "txt"):("txt", converttxt), ("xlf"):("txt", converttxt)}
91 parser = convert.ConvertOptionParser(formats, usetemplates=True, description=__doc__)
92 parser.add_option("", "--encoding", dest="encoding", default='utf-8', type="string",
93 help="The encoding of the template file (default: UTF-8)")
94 parser.passthrough.append("encoding")
95 if textwrap is not None:
96 parser.add_option("-w", "--wrap", dest="wrap", default=None, type="int",
97 help="set number of columns to wrap text at", metavar="WRAP")
98 parser.passthrough.append("wrap")
99 parser.add_fuzzy_option()
100 parser.run(argv)
103 if __name__ == '__main__':
104 main()