2 # -*- coding: utf-8 -*-
4 # Copyright 2007 Zuza Software Foundation
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
22 """convert .ini files to Gettext PO localization files"""
25 from translate
.storage
import po
26 from translate
.storage
import xliff
27 from translate
.storage
import ini
30 """convert a .ini file to a .po file for handling the translation..."""
31 def convertstore(self
, theinifile
, duplicatestyle
="msgctxt"):
32 """converts a .ini file to a .po file..."""
33 thetargetfile
= po
.pofile()
34 targetheader
= thetargetfile
.makeheader(charset
="UTF-8", encoding
="8bit")
35 targetheader
.addnote("extracted from %s" % theinifile
.filename
, "developer")
36 thetargetfile
.addunit(targetheader
)
37 for iniunit
in theinifile
.units
:
38 pounit
= self
.convertunit(iniunit
, "developer")
39 if pounit
is not None:
40 thetargetfile
.addunit(pounit
)
41 thetargetfile
.removeduplicates(duplicatestyle
)
44 def mergestore(self
, originifile
, translatedinifile
, blankmsgstr
=False, duplicatestyle
="msgctxt"):
45 """converts two .ini files to a .po file..."""
46 thetargetfile
= po
.pofile()
47 targetheader
= thetargetfile
.makeheader(charset
="UTF-8", encoding
="8bit")
48 targetheader
.addnote("extracted from %s, %s" % (originifile
.filename
, translatedinifile
.filename
), "developer")
49 thetargetfile
.addunit(targetheader
)
50 translatedinifile
.makeindex()
51 for origini
in originifile
.units
:
52 origpo
= self
.convertunit(origini
, "developer")
53 # try and find a translation of the same name...
54 origininame
= "".join(origini
.getlocations())
55 if origininame
in translatedinifile
.locationindex
:
56 translatedini
= translatedinifile
.locationindex
[origininame
]
57 translatedpo
= self
.convertunit(translatedini
, "translator")
60 # if we have a valid po unit, get the translation and add it...
61 if origpo
is not None:
62 if translatedpo
is not None and not blankmsgstr
:
63 origpo
.target
= translatedpo
.source
64 thetargetfile
.addunit(origpo
)
65 elif translatedpo
is not None:
66 print >> sys
.stderr
, "error converting original ini definition %s" % origini
.name
67 thetargetfile
.removeduplicates(duplicatestyle
)
70 def convertunit(self
, iniunit
, commenttype
):
71 """Converts a .ini unit to a .po unit. Returns None if empty
72 or not for translation."""
76 pounit
= po
.pounit(encoding
="UTF-8")
77 pounit
.addlocation("".join(iniunit
.getlocations()))
78 pounit
.source
= iniunit
.source
82 def convertini(inputfile
, outputfile
, templatefile
, pot
=False, duplicatestyle
="msgctxt"):
83 """reads in inputfile using ini, converts using ini2po, writes to outputfile"""
84 inputstore
= ini
.inifile(inputfile
)
86 if templatefile
is None:
87 outputstore
= convertor
.convertstore(inputstore
, duplicatestyle
=duplicatestyle
)
89 templatestore
= ini
.inifile(templatefile
)
90 outputstore
= convertor
.mergestore(templatestore
, inputstore
, blankmsgstr
=pot
, duplicatestyle
=duplicatestyle
)
91 if outputstore
.isempty():
93 outputfile
.write(str(outputstore
))
97 from translate
.convert
import convert
98 formats
= {"ini": ("po", convertini
), ("ini", "ini"): ("po", convertini
)}
99 parser
= convert
.ConvertOptionParser(formats
, usetemplates
=True, usepots
=True, description
=__doc__
)
100 parser
.add_duplicates_option()
101 parser
.passthrough
.append("pot")
104 if __name__
== '__main__':