Android提供了一套很方便的进行资源(语言)国际化机制,为了更好地支持多语言,很多工程的翻译往往会放到类似crowdin这样的平台上。资源是全了,但是还是会有一些问题。
以下使用一些语言进行举例。其中values为工程默认的资源。
filenos:false removeRepeatedStrings.pylink
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #!/usr/bin/env python # coding=utf-8 from os import listdir,path, system from sys import argv try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET def genRegionLangPair(filePath): basicLanguage = None if ('values' in filePath) : hasRegionLimit = ('r' == filePath[-3:-2]) if (hasRegionLimit): basicLanguage = filePath[0:-4] if (not path.exists(basicLanguage)) : return None belongsToEnglish = ("values-en" in basicLanguage) if (belongsToEnglish): #Compare with the res/values/strings.xml return (path.dirname(basicLanguage) + '/values/strings.xml', filePath + "/strings.xml") else: return (basicLanguage + '/strings.xml', filePath + "/strings.xml") return None def genLangPair(filePath): def shouldGenLanPair(filePath): if (not 'values' in filePath ): return False if('dpi' in filePath): return False if ('dimes' in filePath): return False if ('large' in filePath): return False return True if(shouldGenLanPair(filePath)): basicLanguage = path.dirname(filePath) + '/values/strings.xml' targetLanguage = filePath + '/strings.xml' if (not path.exists(targetLanguage)): return None if (not path.samefile(basicLanguage,targetLanguage)) : return (basicLanguage, targetLanguage) return None def genCompareList(filePath): compareLists = [] for file in listdir(filePath): regionPair = genRegionLangPair(filePath + '/' + file) if (None != regionPair): compareLists.append(regionPair) languagePair = genLangPair(filePath + '/' + file) if (None != languagePair) : compareLists.append(languagePair) return compareLists def getXmlEntries(filePath): root = ET.ElementTree(file=filePath).getroot() entries = {} for child in root: attrib = child.attrib if (None != attrib) : entries[attrib.get('name')] = child.text print 'xmlEntriesCount',len(entries) return entries def rewriteRegionFile(sourceEntries, filePath): if (not path.exists(filePath)): return ET.register_namespace('xliff',"urn:oasis:names:tc:xliff:document:1.2") tree = ET.ElementTree(file=filePath) root = tree.getroot() print root totalCount = 0 removeCount = 0 unRemoveCount = 0 print len(root) toRemoveList = [] for child in root: totalCount = totalCount + 1 attrib = child.attrib if (None == attrib): continue childName = attrib.get('name') if (sourceEntries.get(childName) == child.text): removeCount = removeCount + 1 toRemoveList.append(child) else: unRemoveCount = unRemoveCount + 1 print childName, sourceEntries.get(childName), child.text print filePath,totalCount, removeCount,unRemoveCount for aItem in toRemoveList: root.remove(aItem) if (len(root) != 0 ): tree.write(filePath, encoding="UTF-8") else: command = 'rm -rf %s'%(path.dirname(filePath)) print command system(command) def main(projectDir): lists = genCompareList(projectDir + "/res/") for item in lists: print item src = item[0] dest = item[1] rewriteRegionFile(getXmlEntries(src),dest) if __name__ == "__main__": if (len(argv) == 2) : main(argv[1]) |
---|
filenos:false
1 | python removeRepeatedStrings.py your_android_project_root_dir |
---|