#!/usr/bin/python # Go through all the res_src strings.xml files, and copy them over # into the world where they'll get used in a build. This is meant to # allow them to be built-in as an alternative to the # locutils/downloadable system. import re, sys, os, getopt from lxml import etree s_prefix = 'XLATE ME: ' sComment = """ DO NOT EDIT THIS FILE!!!! It was generated (from %s). Any changes you make to it will be lost. """ def sameOrSameWithPrefix( str1, str2 ): result = str1 == str2 if not result: if str1.startswith(s_prefix): result = str1[len(s_prefix):] == str2 return result def sameAsEnglishPlural(engNames, strElem): strs = engNames[strElem.get('name')]['strings'] str = strElem.text result = 1 == len(strs) and 'other' in strs \ and sameOrSameWithPrefix( str, strs['other'] ) return result def loadPlural(plural): items = {} for child in plural.getchildren(): items[child.get('quantity')] = child.text return items def checkAndCopy( engNames, src, dest, verbose ): parser = etree.XMLParser(remove_blank_text=True, encoding="utf-8") doc = etree.parse(src, parser) for elem in doc.getroot().iter(): if 'resources' == elem.tag: pass elif 'item' == elem.tag: pass elif 'string' == elem.tag: name = elem.get('name') if not name in engNames or elem.text.startswith(s_prefix): elem.getparent().remove( elem ) elif not 'string' == engNames[name]['type']: if 'plurals' == engNames[name]['type']: if sameAsEnglishPlural( engNames, elem ): elem.getparent().remove( elem ) else: elem.tag = 'plurals' item = etree.Element("item") item.text = elem.text elem.text = None item.set('quantity', 'other') elem.append( item ) if verbose: print 'translated string', name, 'to plural' else: elem.getparent().remove( elem ) elif engNames[name]['string'] == elem.text: if verbose: print "Same as english: name: %s; text: %s" % (name, elem.text) elem.getparent().remove( elem ) elif 'plurals' == elem.tag: name = elem.get('name') if not name in engNames or not 'plurals' == engNames[name]['type']: # print 'removing', name elem.getparent().remove( elem ) elif not isinstance( elem.tag, basestring ): # comment elem.getparent().remove(elem) else: print 'unexpected elem:', elem.tag sys.exit(1) if True: comment = etree.Comment(sComment % (src)) doc.getroot().insert( 0, comment ) dir = os.path.dirname( dest ) try: os.makedirs( dir ) except: pass out = open( dest, "w" ) out.write( etree.tostring( doc, pretty_print=True, encoding="utf-8", xml_declaration=True ) ) def main(): # add these via params later excepts = ['values-ca_PS', 'values-ba_CK'] verboses = ['values-fr'] # summarize the english file wd = os.path.dirname(sys.argv[0]) path = wd + '/../XWords4/res/values/strings.xml' engNames = {} engFormats = {} parser = etree.XMLParser(remove_blank_text=True, encoding="utf-8") doc = etree.parse(path, parser) pat = re.compile( '(%\d\$[sd])', re.DOTALL | re.MULTILINE ) for typ in ['string', 'plurals']: for elem in doc.findall(typ): name = elem.get('name') item = { 'type' : typ } if typ == 'string': item['string'] = elem.text else: item['strings'] = loadPlural(elem) engNames[name] = item # print engNames # iterate over src files for subdir, dirs, files in os.walk('res_src'): for file in [file for file in files if file == "strings.xml"]: path = "%s/%s" % (subdir, file) for excpt in excepts: if excpt in path : path = None break if path: verbose = 0 < len([verb for verb in verboses if verb in path]) print "*** looking at %s ***" % (path) dest = path.replace( 'res_src', 'res', 1 ) checkAndCopy( engNames, path, dest, verbose ) ############################################################################## if __name__ == '__main__': main()