Package translate :: Package convert :: Module oo2xliff
[hide private]
[frames] | no frames]

Source Code for Module translate.convert.oo2xliff

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  # 
  4  # Copyright 2003-2008 Zuza Software Foundation 
  5  # 
  6  # This file is part of translate. 
  7  # 
  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. 
 12  # 
 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. 
 17  # 
 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 
 21  # 
 22   
 23  """convert an OpenOffice.org (SDF) localization file to XLIFF localization files 
 24   
 25  User documentation: http://translate.sourceforge.net/wiki/toolkit/oo2po 
 26  """ 
 27   
 28  import sys 
 29  from urllib import urlencode 
 30   
 31  from translate.storage import xliff 
 32  from translate.storage import oo 
 33   
 34  # TODO: support using one GSI file as template, another as input (for when English is in one and translation in another) 
 35   
 36   
37 -class oo2xliff:
38
39 - def __init__(self, sourcelanguage, targetlanguage, blankmsgstr=False, long_keys=False):
40 """construct an oo2xliff converter for the specified languages""" 41 self.sourcelanguage = sourcelanguage 42 self.targetlanguage = targetlanguage 43 self.blankmsgstr = blankmsgstr 44 self.long_keys = long_keys
45
46 - def maketargetunit(self, part1, part2, translators_comment, key, subkey):
47 """makes a base unit (.po or XLIFF) out of a subkey of two parts""" 48 #TODO: Do better 49 text1 = getattr(part1, subkey) 50 if text1 == "": 51 return None 52 text2 = getattr(part2, subkey) 53 54 unit = xliff.xliffunit(text1) 55 unit.target = text2 56 if unit.target: 57 unit.markfuzzy(False) 58 else: 59 unit.markfuzzy(True) 60 unit.addlocation(key + "." + subkey) 61 if getattr(translators_comment, subkey).strip() != "": 62 unit.addnote(getattr(translators_comment, subkey), origin="developer") 63 return unit
64
65 - def convertelement(self, theoo):
66 """convert an oo element into a list of base units (.po or XLIFF)""" 67 if self.sourcelanguage in theoo.languages: 68 part1 = theoo.languages[self.sourcelanguage] 69 else: 70 print >> sys.stderr, "/".join(theoo.lines[0].getkey()), "language not found: %s" % (self.sourcelanguage) 71 return [] 72 if self.blankmsgstr: 73 # use a blank part2 74 part2 = oo.ooline() 75 else: 76 if self.targetlanguage in theoo.languages: 77 part2 = theoo.languages[self.targetlanguage] 78 else: 79 # if the language doesn't exist, the translation is missing ... so make it blank 80 part2 = oo.ooline() 81 if "x-comment" in theoo.languages: 82 translators_comment = theoo.languages["x-comment"] 83 else: 84 translators_comment = oo.ooline() 85 key = oo.makekey(part1.getkey(), self.long_keys) 86 unitlist = [] 87 for subkey in ("text", "quickhelptext", "title"): 88 unit = self.maketargetunit(part1, part2, translators_comment, key, subkey) 89 if unit is not None: 90 unitlist.append(unit) 91 return unitlist
92
93 - def convertstore(self, theoofile, duplicatestyle="msgctxt"):
94 """converts an entire oo file to a base class format (.po or XLIFF)""" 95 thetargetfile = xliff.xlifffile() 96 thetargetfile.setsourcelanguage(self.sourcelanguage) 97 thetargetfile.settargetlanguage(self.targetlanguage) 98 # create a header for the file 99 bug_url = 'http://qa.openoffice.org/issues/enter_bug.cgi?%s' % \ 100 urlencode({"subcomponent": "ui", 101 "comment": "", 102 "short_desc": "Localization issue in file: %s" % \ 103 theoofile.filename, 104 "component": "l10n", 105 "form_name": "enter_issue", 106 }) 107 # go through the oo and convert each element 108 for theoo in theoofile.units: 109 unitlist = self.convertelement(theoo) 110 for unit in unitlist: 111 thetargetfile.addunit(unit) 112 return thetargetfile
113 114
115 -def verifyoptions(options):
116 """verifies the commandline options""" 117 if not options.targetlanguage: 118 raise ValueError("You must specify the target language.")
119 120
121 -def convertoo(inputfile, outputfile, templates, pot=False, sourcelanguage=None, targetlanguage=None, duplicatestyle="msgctxt", multifilestyle="single"):
122 """reads in stdin using inputstore class, converts using convertorclass, writes to stdout""" 123 inputstore = oo.oofile() 124 if hasattr(inputfile, "filename"): 125 inputfilename = inputfile.filename 126 else: 127 inputfilename = "(input file name not known)" 128 inputstore.filename = inputfilename 129 inputstore.parse(inputfile.read()) 130 if not sourcelanguage: 131 testlangtype = targetlanguage or (inputstore and inputstore.languages[0]) or "" 132 if testlangtype.isdigit(): 133 sourcelanguage = "01" 134 else: 135 sourcelanguage = "en-US" 136 if not sourcelanguage in inputstore.languages: 137 print >> sys.stderr, "Warning: sourcelanguage '%s' not found in inputfile '%s' (contains %s)" % (sourcelanguage, inputfilename, ", ".join(inputstore.languages)) 138 if not pot and targetlanguage and targetlanguage not in inputstore.languages: 139 print >> sys.stderr, "Warning: targetlanguage '%s' not found in inputfile '%s' (contains %s)" % (targetlanguage, inputfilename, ", ".join(inputstore.languages)) 140 convertor = oo2xliff(sourcelanguage, targetlanguage, blankmsgstr=pot, long_keys=multifilestyle!="single") 141 outputstore = convertor.convertstore(inputstore, duplicatestyle) 142 if outputstore.isempty(): 143 return 0 144 outputfile.write(str(outputstore)) 145 return 1
146 147
148 -def main(argv=None):
149 from translate.convert import convert 150 formats = {"oo": ("xlf", convertoo), "sdf": ("xlf", convertoo)} 151 # always treat the input as an archive unless it is a directory 152 archiveformats = {(None, "input"): oo.oomultifile} 153 parser = convert.ArchiveConvertOptionParser(formats, usepots=False, description=__doc__, archiveformats=archiveformats) 154 parser.add_option("-l", "--language", dest="targetlanguage", default=None, 155 help="set target language to extract from oo file (e.g. af-ZA)", metavar="LANG") 156 parser.add_option("", "--source-language", dest="sourcelanguage", default=None, 157 help="set source language code (default en-US)", metavar="LANG") 158 parser.add_option("", "--nonrecursiveinput", dest="allowrecursiveinput", default=True, action="store_false", help="don't treat the input oo as a recursive store") 159 parser.add_duplicates_option() 160 parser.add_multifile_option() 161 parser.passthrough.append("sourcelanguage") 162 parser.passthrough.append("targetlanguage") 163 parser.verifyoptions = verifyoptions 164 parser.run(argv)
165 166 167 if __name__ == '__main__': 168 main() 169