You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
6.0 KiB
129 lines
6.0 KiB
#!/usr/bin/env python |
|
import os |
|
import json |
|
from xml.dom.minidom import parse |
|
import xml.dom.minidom |
|
import codecs |
|
import sys |
|
|
|
qgcFileTypeKey = "fileType" |
|
translateKeysKey = "translateKeys" |
|
arrayIDKeysKey = "arrayIDKeys" |
|
disambiguationPrefix = "#loc.disambiguation#" |
|
|
|
def parseJsonObjectForTranslateKeys(jsonObjectHierarchy, jsonObject, translateKeys, arrayIDKeys, locStringDict): |
|
for translateKey in translateKeys: |
|
if (translateKey in jsonObject): |
|
locStr = jsonObject[translateKey] |
|
currentHierarchy = jsonObjectHierarchy + "." + translateKey |
|
if locStr in locStringDict: |
|
# Duplicate of an existing string |
|
locStringDict[locStr].append(currentHierarchy) |
|
else: |
|
# First time we are seeing this string |
|
locStringDict[locStr] = [ currentHierarchy ] |
|
for key in jsonObject: |
|
currentHierarchy = jsonObjectHierarchy + "." + key |
|
if (type(jsonObject[key]) == type({})): |
|
parseJsonObjectForTranslateKeys(currentHierarchy, jsonObject[key], translateKeys,arrayIDKeys, locStringDict) |
|
elif (type(jsonObject[key]) == type([])): |
|
parseJsonArrayForTranslateKeys(currentHierarchy, jsonObject[key], translateKeys, arrayIDKeys, locStringDict) |
|
|
|
def parseJsonArrayForTranslateKeys(jsonObjectHierarchy, jsonArray, translateKeys, arrayIDKeys, locStringDict): |
|
for index in range(0, len(jsonArray)): |
|
jsonObject = jsonArray[index] |
|
arrayIndexStr = str(index) |
|
for arrayIDKey in arrayIDKeys: |
|
if arrayIDKey in jsonObject.keys(): |
|
arrayIndexStr = jsonObject[arrayIDKey] |
|
break |
|
currentHierarchy = jsonObjectHierarchy + "[" + arrayIndexStr + "]" |
|
parseJsonObjectForTranslateKeys(currentHierarchy, jsonObject, translateKeys, arrayIDKeys, locStringDict) |
|
|
|
def addLocKeysBasedOnQGCFileType(jsonPath, jsonDict): |
|
# Instead of having to add the same keys over and over again in a pile of files we add them here automatically based on file type |
|
if qgcFileTypeKey in jsonDict: |
|
qgcFileType = jsonDict[qgcFileTypeKey] |
|
translateKeyValue = "" |
|
arrayIDKeysKeyValue = "" |
|
if qgcFileType == "MavCmdInfo": |
|
translateKeyValue = "label,enumStrings,friendlyName,description,category" |
|
arrayIDKeysKeyValue = "rawName,comment" |
|
elif qgcFileType == "FactMetaData": |
|
translateKeyValue = "shortDescription,longDescription,enumStrings" |
|
arrayIDKeysKeyValue = "name" |
|
if translateKeysKey not in jsonDict and translateKeyValue != "": |
|
jsonDict[translateKeysKey] = translateKeyValue |
|
if arrayIDKeysKey not in jsonDict and arrayIDKeysKeyValue != "": |
|
jsonDict[arrayIDKeysKey] = arrayIDKeysKeyValue |
|
|
|
def parseJson(jsonPath, locStringDict): |
|
jsonFile = open(jsonPath, "rb") |
|
jsonDict = json.load(jsonFile) |
|
if (type(jsonDict) != type({})): |
|
return |
|
addLocKeysBasedOnQGCFileType(jsonPath, jsonDict) |
|
if (not translateKeysKey in jsonDict): |
|
return |
|
translateKeys = jsonDict[translateKeysKey].split(",") |
|
arrayIDKeys = jsonDict.get(arrayIDKeysKey, "").split(",") |
|
parseJsonObjectForTranslateKeys("", jsonDict, translateKeys, arrayIDKeys, locStringDict) |
|
|
|
def walkDirectoryTreeForJsonFiles(dir, multiFileLocArray): |
|
for filename in os.listdir(dir): |
|
path = os.path.join(dir, filename) |
|
if (os.path.isfile(path) and filename.endswith(".json")): |
|
#print "json",path |
|
singleFileLocStringDict = {} |
|
parseJson(path, singleFileLocStringDict) |
|
if len(singleFileLocStringDict.keys()): |
|
# Check for duplicate file names |
|
for entry in multiFileLocArray: |
|
if entry[0] == filename: |
|
print("Error: Duplicate filenames: %s paths: %s %s" % (filename, path, entry[1])) |
|
sys.exit(1) |
|
multiFileLocArray.append([filename, path, singleFileLocStringDict]) |
|
if (os.path.isdir(path)): |
|
walkDirectoryTreeForJsonFiles(path, multiFileLocArray) |
|
|
|
def writeJsonTSFile(multiFileLocArray): |
|
jsonTSFile = codecs.open('qgc-json.ts', 'w', "utf-8") |
|
jsonTSFile.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n") |
|
jsonTSFile.write("<!DOCTYPE TS>\n") |
|
jsonTSFile.write("<TS version=\"2.1\">\n") |
|
for entry in multiFileLocArray: |
|
jsonTSFile.write("<context>\n") |
|
jsonTSFile.write(" <name>%s</name>\n" % entry[0]) |
|
singleFileLocStringDict = entry[2] |
|
for locStr in singleFileLocStringDict.keys(): |
|
disambiguation = "" |
|
if locStr.startswith(disambiguationPrefix): |
|
workStr = locStr[len(disambiguationPrefix):] |
|
terminatorIndex = workStr.find("#") |
|
if terminatorIndex == -1: |
|
print("Bad disambiguation %1 '%2'" % (entry[0], locStr)) |
|
sys.exit(1) |
|
disambiguation = workStr[:terminatorIndex] |
|
locStr = workStr[terminatorIndex+1:] |
|
jsonTSFile.write(" <message>\n") |
|
if len(disambiguation): |
|
jsonTSFile.write(" <comment>%s</comment>\n" % disambiguation) |
|
extraCommentStr = "" |
|
for jsonHierachy in singleFileLocStringDict[locStr]: |
|
extraCommentStr += "%s, " % jsonHierachy |
|
jsonTSFile.write(" <extracomment>%s</extracomment>\n" % extraCommentStr) |
|
jsonTSFile.write(" <location filename=\"%s\"/>\n" % entry[1]) |
|
jsonTSFile.write(" <source>%s</source>\n" % locStr) |
|
jsonTSFile.write(" <translation type=\"unfinished\"></translation>\n") |
|
jsonTSFile.write(" </message>\n") |
|
jsonTSFile.write("</context>\n") |
|
jsonTSFile.write("</TS>\n") |
|
jsonTSFile.close() |
|
|
|
def main(): |
|
multiFileLocArray = [] |
|
walkDirectoryTreeForJsonFiles("../src", multiFileLocArray) |
|
writeJsonTSFile(multiFileLocArray) |
|
|
|
if __name__ == '__main__': |
|
main()
|
|
|