add read of translated string to script

pull/1306/head
Audric Ackermann 4 years ago
parent a1824215d4
commit 5cebb41b45
No known key found for this signature in database
GPG Key ID: 999F434D76324AD4

@ -6,6 +6,7 @@ from glob import glob
import json
import sys
import xmltodict
import traceback
# androidKey
# "androidKeyCount": "one" or "other" used to find matching key with quantity
@ -31,46 +32,56 @@ desktopDst = json.loads(open(f"_locales/{dest}/messages.json",
androidEnValueFile = f"{androidRoot}/res/values/strings.xml"
androidTranslatedValueFile = f"{androidRoot}/res/values-{dest}/strings.xml"
print(f"androidEnValueFile {androidEnValueFile}")
print(f"androidTranslatedValueFile {androidTranslatedValueFile}")
androidEnXml = open(androidEnValueFile, "r").read()
androidTranslatedXml = open(androidTranslatedValueFile, "r").read()
androidEnJsonSingular = xmltodict.parse(androidEnXml)['resources']['string']
androidEnJsonPlurals = xmltodict.parse(androidEnXml)['resources']['plurals']
def getDictFromFile(filepath, keyToSearch):
xml = open(filepath, "r").read()
asDict = xmltodict.parse(xml)['resources'][keyToSearch]
return [dict(item) for item in asDict]
androidEnJsonSingular = [dict(item) for item in androidEnJsonSingular]
androidEnJsonPlurals = [dict(item) for item in androidEnJsonPlurals]
androidTranslatedJson = xmltodict.parse(androidTranslatedXml)
def getStringFromFileAsJSON(filepath):
return getDictFromFile(filepath, 'string')
# print(f"androidTranslatedXml {androidTranslatedXml}")
def getPluralsFromFileAsJSON(filepath):
return getDictFromFile(filepath, 'plurals')
# read and extract values from xml file in EN android side
androidEnJsonSingular = getStringFromFileAsJSON(androidEnValueFile)
androidEnJsonPlurals = getPluralsFromFileAsJSON(androidEnValueFile)
# read and extract values from xml file in DESTINATION LANGUAGE android side
androidDestJsonSingular = getStringFromFileAsJSON(androidTranslatedValueFile)
androidDestJsonPlurals = getPluralsFromFileAsJSON(androidTranslatedValueFile)
# print(f"androidDestJsonSingular {androidDestJsonSingular}")
# print(f"androidDestJsonPlurals {androidDestJsonPlurals}")
# print(f"\n\n\n\n androidEnJsonSingular {androidEnJsonSingular}")
# print(f"\n\n\n\n androidEnJsonPlurals {androidEnJsonPlurals}")
missingAndroidKeyCount = 0
notMatchingCount = 0
def findCountInItem(quantityStr, items):
found = [item for item in items if item['@quantity'] == quantityStr]
# print(f'findCountInItem: {found}, quantityStr: {quantityStr}')
if len(found) != 1:
raise Exception(f'quantityStr not found: {quantityStr} ')
raise KeyError(f'quantityStr not found: {quantityStr} ')
return dict(found[0])
def findByNameSingular(keySearchedFor, singularString):
found = [item for item in singularString if item['@name'] == keySearchedFor]
if len(found) != 1:
raise Exception(f'android key not found: {keySearchedFor} but should have been found')
raise KeyError(f'android key singular not found: {keySearchedFor} but should have been found')
return found[0]
def findByNamePlurals(keySearchedFor, pluralsString, quantityStr):
found = [item for item in pluralsString if item['@name'] == keySearchedFor]
if len(found) != 1:
raise Exception(f'android key not found: {keySearchedFor} but should have been found')
found = findCountInItem(quantityStr, found[0]['item'])
raise KeyError(f'android key plurals not found: {keySearchedFor} but should have been found')
return findCountInItem(quantityStr, found[0]['item'])
return found
def validateKeysPresent(items):
for keyItem, valueItem in items:
@ -80,11 +91,9 @@ def validateKeysPresent(items):
# print(f"keyItem: '{keyItem}', valueItem: '{valueItem}'")
# morph a string from android syntax to desktop syntax. Like replacing char, or %s
def morphToDesktopSyntax(androidString, desktopItem):
# print(f"androidString: '{androidString}', desktopItem: '{desktopItem}'")
replaced = androidString.replace(r"\'", "'")
# replaced = androidString.replace(r"\", "'")
# replaced = androidString.replace('', )
if('wordCapitalize' in desktopItem.keys() and desktopItem['wordCapitalize']):
replaced = replaced.title()
@ -100,40 +109,60 @@ def morphToDesktopSyntax(androidString, desktopItem):
replaced = f'{toAdd}{replaced}'
return replaced
notMatching = 0
def getAndroidItem(androidKey, androidKeyCount, singularJson, pluralsJson):
if androidKeyCount:
return findByNamePlurals(androidKey, pluralsJson, androidKeyCount)
else:
return findByNameSingular(androidKey, singularJson)
def getAndroidKeyCountFromItem(item):
androidKeyCount = None
if 'androidKeyCount' in item.keys():
androidKeyCount = item['androidKeyCount']
return androidKeyCount
for key, value in desktopSrc.items():
# print(f"key: '{key}', value: '{value}'")
items = value.items()
################### MAIN #####################
for key, itemEnDesktop in desktopSrc.items():
# print(f"key: '{key}', itemEnDesktop: '{itemEnDesktop}'")
items = itemEnDesktop.items()
validateKeysPresent(items)
if 'androidKey' not in value.keys():
if 'androidKey' not in itemEnDesktop.keys():
# print('androidKey not found for {key}')
missingAndroidKeyCount = missingAndroidKeyCount + 1
continue
androidKey = value['androidKey']
androidKeyCount = None
if 'androidKeyCount' in value.keys():
androidKeyCount = value['androidKeyCount']
androidKey = itemEnDesktop['androidKey']
androidKeyCount = getAndroidKeyCountFromItem(itemEnDesktop)
# print(f'key: {key}, androidKey: {androidKey}, androidKeyCount: {androidKeyCount}')
itemEnDesktop = desktopSrc[key]
txtEnDesktop = itemEnDesktop['message']
if androidKeyCount:
itemEnAndroid = findByNamePlurals(androidKey, androidEnJsonPlurals, androidKeyCount)
else:
itemEnAndroid = findByNameSingular(androidKey, androidEnJsonSingular)
itemEnAndroid = getAndroidItem(androidKey, androidKeyCount, androidEnJsonSingular, androidEnJsonPlurals)
txtEnAndroid = itemEnAndroid['#text']
morphedEnAndroid = morphToDesktopSyntax(txtEnAndroid, itemEnDesktop)
if (txtEnDesktop != morphedEnAndroid):
print(f'\t\tDOES NOT MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}", itemEnDesktop: {itemEnDesktop}\n\n')
notMatching = notMatching + 1
# else:
# print(f'MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}"')
notMatchingCount = notMatchingCount + 1
else:
# if it does match, find the corresponding value on the target language on android
print(f'MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}"')
try:
textTranslated = getAndroidItem(androidKey, androidKeyCount, androidDestJsonSingular, androidDestJsonPlurals)['#text']
print(f'textTranslated: "{textTranslated}"')
textMorphed = morphToDesktopSyntax(textTranslated, itemEnDesktop)
print(f'textMorphed: "{textMorphed}"')
except KeyError:
print('KeyError exception:', traceback.format_exc())
print(f"total keys missing {missingAndroidKeyCount}") # androidKey set on desktop but not found on android EN resources
print(f"total text not matching EN to EN {notMatching}")
print(f"total text not matching EN to EN {notMatchingCount}")
Loading…
Cancel
Save