mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-04 23:02:02 +01:00
The Japanese translation has a number of plurals with "one" quantities
but no "other", which crashes. "Fix" these by making the copy script turn one into other, which may well make sense given Japanese grammer. At any rate it prevents crashes until I can work it out with the translator and/or weblate.
This commit is contained in:
parent
b9b9038c66
commit
5ef7495d51
1 changed files with 76 additions and 15 deletions
|
@ -9,7 +9,9 @@ import re, sys, os, getopt
|
|||
from lxml import etree
|
||||
|
||||
s_prefix = 'XLATE ME: '
|
||||
|
||||
# languages in which it's ok to make a standalone quantity="one" into
|
||||
# quantity="other"
|
||||
g_oneToOthers = ['values-ja']
|
||||
|
||||
sComment = """
|
||||
DO NOT EDIT THIS FILE!!!!
|
||||
|
@ -31,34 +33,90 @@ def sameAsEnglishPlural(engNames, strElem):
|
|||
and sameOrSameWithPrefix( str, strs['other'] )
|
||||
return result
|
||||
|
||||
def pluralsIsSame(engNames, plurals):
|
||||
different = False # all children duplicates of English
|
||||
strings = engNames[plurals.get('name')]['strings']
|
||||
# If has a one and no (or empty) other, convert the one to other
|
||||
def tryConvertOne( plurals ):
|
||||
quantities = {}
|
||||
for item in plurals.getchildren():
|
||||
quantities[item.get("quantity")] = item
|
||||
|
||||
use = False
|
||||
if "one" in quantities:
|
||||
if "other" in quantities:
|
||||
text = quantities['other'].text
|
||||
if not text or 0 == len(text):
|
||||
use = True
|
||||
else:
|
||||
use = True
|
||||
|
||||
if use:
|
||||
print "converting", plurals.get('name')
|
||||
plurals.remove(quantities['other'])
|
||||
quantities['one'].set('quantity', 'other')
|
||||
|
||||
def pluralsIsBogus(engNames, plurals, verbose):
|
||||
haveOther = False # will crash without one
|
||||
bogus = False
|
||||
for item in plurals.getchildren():
|
||||
quantity = item.get('quantity')
|
||||
text = item.text
|
||||
if not text or 0 == len(text):
|
||||
print "bogus empty item in", plurals.get('name')
|
||||
bogus = True
|
||||
if verbose:
|
||||
quantity = item.get("quantity")
|
||||
print 'dropping plurals {name} because of empty/missing \"{quantity}\"' \
|
||||
.format(name=plurals.get("name"), quantity=quantity )
|
||||
break
|
||||
if item.get("quantity") == "other":
|
||||
haveOther = True
|
||||
|
||||
if verbose and not bogus and not haveOther:
|
||||
print "dropping plurals {name} because no \"other\" quantity" \
|
||||
.format(name=plurals.get("name"))
|
||||
|
||||
return bogus or not haveOther
|
||||
|
||||
def pluralsIsSame(engNames, plurals):
|
||||
different = False # all children duplicates of English
|
||||
engItem = engNames[plurals.get('name')]
|
||||
strings = engItem['strings']
|
||||
for item in plurals.getchildren():
|
||||
text = item.text
|
||||
if not text or 0 == len(text):
|
||||
print "bogus empty plurals item in", plurals.get('name')
|
||||
engItem = engItem
|
||||
sys.exit(1)
|
||||
|
||||
quantity = item.get('quantity')
|
||||
if quantity in strings:
|
||||
if sameOrSameWithPrefix( strings[quantity], text ):
|
||||
different = True
|
||||
return different
|
||||
|
||||
def checkPlurals( engNames, elem ):
|
||||
# path will be something like res_src/values-pt/strings.xml. We want
|
||||
# the next-to-last entry.
|
||||
def valuesDir( path ):
|
||||
splits = path.split('/')
|
||||
return splits[-2]
|
||||
|
||||
def checkPlurals( engNames, elem, src, verbose ):
|
||||
name = elem.get('name')
|
||||
ok = True
|
||||
if not name in engNames or not 'plurals' == engNames[name]['type']:
|
||||
print 'plurals', name, 'not in engNames or not a plurals there'
|
||||
ok = False
|
||||
elif pluralsIsSame(engNames, elem):
|
||||
|
||||
if ok and valuesDir(src) in g_oneToOthers:
|
||||
tryConvertOne( elem )
|
||||
|
||||
if ok and pluralsIsBogus(engNames, elem, verbose):
|
||||
ok = False
|
||||
else:
|
||||
if ok and pluralsIsSame(engNames, elem):
|
||||
ok = False
|
||||
if ok:
|
||||
for item in elem.getchildren():
|
||||
if 0 == len(item.text):
|
||||
ok = False
|
||||
print 'bad empty item', name
|
||||
sys.exit(1)
|
||||
ok = True
|
||||
return ok
|
||||
|
||||
def loadPlural(plural):
|
||||
|
@ -78,7 +136,10 @@ def writeDoc(doc, src, dest):
|
|||
|
||||
def checkOrConvertString(engNames, elem, verbose):
|
||||
name = elem.get('name')
|
||||
if not name in engNames or elem.text.startswith(s_prefix):
|
||||
if not elem.text:
|
||||
print "elem", name, "is empty"
|
||||
sys.exit(1)
|
||||
elif not name in engNames or elem.text.startswith(s_prefix):
|
||||
ok = False
|
||||
elif not 'string' == engNames[name]['type']:
|
||||
if 'plurals' == engNames[name]['type']:
|
||||
|
@ -111,7 +172,7 @@ def checkAndCopy( parser, engNames, src, dest, verbose ):
|
|||
elem.getparent().remove(elem)
|
||||
|
||||
for elem in doc.findall('plurals'):
|
||||
if not checkPlurals(engNames, elem):
|
||||
if not checkPlurals(engNames, elem, src, verbose):
|
||||
elem.getparent().remove(elem)
|
||||
|
||||
writeDoc(doc, src, dest)
|
||||
|
@ -119,7 +180,7 @@ def checkAndCopy( parser, engNames, src, dest, verbose ):
|
|||
def main():
|
||||
# add these via params later
|
||||
excepts = ['values-ca_PS', 'values-ba_CK']
|
||||
verboses = ['values-fr']
|
||||
verboses = ['values-ja']
|
||||
|
||||
# summarize the english file
|
||||
wd = os.path.dirname(sys.argv[0])
|
||||
|
@ -128,10 +189,10 @@ def main():
|
|||
|
||||
engFormats = {}
|
||||
parser = etree.XMLParser(remove_blank_text=True, encoding="utf-8")
|
||||
doc = etree.parse(path, parser)
|
||||
engDoc = etree.parse(path, parser)
|
||||
pat = re.compile( '(%\d\$[sd])', re.DOTALL | re.MULTILINE )
|
||||
for typ in ['string', 'plurals']:
|
||||
for elem in doc.findall(typ):
|
||||
for elem in engDoc.findall(typ):
|
||||
name = elem.get('name')
|
||||
item = { 'type' : typ }
|
||||
if typ == 'string':
|
||||
|
|
Loading…
Reference in a new issue