Python實(shí)現(xiàn)刪除Android工程中的冗余字符串

字號(hào):


    Android提供了一套很方便的進(jìn)行資源(語言)國際化機(jī)制,為了更好地支持多語言,很多工程的翻譯往往會(huì)放到類似crowdin這樣的平臺(tái)上。資源是全了,但是還是會(huì)有一些問題。
    哪些問題
    以下使用一些語言進(jìn)行舉例。其中values為工程默認(rèn)的資源。
    1.某語言的資源和某語言限定區(qū)域的資源之間。如values-fr-rCA存在于values-fr相同的字符串,這種表現(xiàn)最為嚴(yán)重。
    2.某語言的資源和默認(rèn)的資源之間。values-fr存在與values相同的字符串,可能原因是由于values-fr存在未翻譯字符串導(dǎo)致
    為什么要去重
    潔癖,容不下半點(diǎn)冗余。
    解決思路
    1.如果values-fr-rCA存在于values-fr相同的字符串,去除values-fr-rCA中的重復(fù)字符串,保留values-fr。這樣可以保證在values-fr-rCA下也可以正確讀取到資源。
    2.如果values-fr存在與values相同的字符串。如去除values-fr中得重復(fù)字符串,保留values的條目。
    Py腳本
    代碼如下:
    #!/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])
    如何使用
    代碼如下:
    python removeRepeatedStrings.py your_android_project_root_dir