xwords/xwords4/android/scripts/mk_for_download.py
Eric House 8612a5f624 use IDs rather than english strings as keys in passing
translations. Requires parallel change on client, and currently
doesn't quite work because e.g. \n is not replaced before the
translation is rendered.
2014-04-24 06:24:38 -07:00

75 lines
2.2 KiB
Python
Executable file

#!/usr/bin/python
import re, sys
from lxml import etree
# Take an English strings.xml file and another, "join" them on the
# name of each string, and then produce an array that's a mapping of
# English to the other. Get ride of extra whitespace etc in the
# English strings so they're identical to how an Android app displays
# them.
english = 'res/values/strings.xml'
other_f = 'res_src/values-%s/strings.xml'
def readIDs(base):
ids = {}
start = re.compile('\s*public static final class string {\s*')
end = re.compile('\s*}\s*')
entry = re.compile('\s*public static final int (\S+)=(0x.*);\s*')
inLine = False
path = base + '/archive/R.java'
for line in open(path, 'r'):
line = line.strip()
# print line
if inLine:
if end.match(line):
break
else:
match = entry.match(line)
if match:
name = match.group(1)
value = int(match.group(2), 16)
ids[name] = value
elif start.match(line):
inLine = True
return ids
def asMap( path, ids ):
map = {}
parser = etree.XMLParser(remove_blank_text=True)
doc = etree.parse( path, parser )
for elem in doc.getroot().iter():
if 'string' == elem.tag:
text = elem.text
if text:
# print 'text before:', text
text = " ".join(re.split('\s+', text)) \
.replace("\\'", "'") \
.replace( '\\"', '"' )
# print 'text after:', text
name = elem.get('name')
id = ids[name]
map[id] = text
return map
def getXlationFor( base, loc ):
ids = readIDs(base)
eng = asMap( base + '/' + english, ids )
other = asMap( base + '/' + other_f % (loc), ids )
result = []
for key in eng.keys():
if key in other:
result.append( { 'id' : key, 'loc' : other[key] } )
return result
def main():
data = getXlationFor( '.', 'ba_CK' )
print data
data = getXlationFor( '.', 'ca_PS' )
print data
##############################################################################
if __name__ == '__main__':
main()