Python实现删除Android工程中的冗余字符串
Android提供了一套很方便的进行资源(语言)国际化机制,为了更好地支持多语言,很多工程的翻译往往会放到类似crowdin这样的平台上。资源是全了,但是还是会有一些问题。
哪些问题
以下使用一些语言进行举例。其中values为工程默认的资源。
1.某语言的资源和某语言限定区域的资源之间。如values-fr-rCA存在于values-fr相同的字符串,这种表现最为严重。
2.某语言的资源和默认的资源之间。values-fr存在与values相同的字符串,可能原因是由于values-fr存在未翻译字符串导致
为什么要去重
洁癖,容不下半点冗余。
解决思路
1.如果values-fr-rCA存在于values-fr相同的字符串,去除values-fr-rCA中的重复字符串,保留values-fr。这样可以保证在values-fr-rCA下也可以正确读取到资源。
2.如果values-fr存在与values相同的字符串。如去除values-fr中得重复字符串,保留values的条目。
Py脚本
#!/usr/bin/envpython #coding=utf-8 fromosimportlistdir,path,system fromsysimportargv try: importxml.etree.cElementTreeasET exceptImportError: importxml.etree.ElementTreeasET
defgenRegionLangPair(filePath): basicLanguage=None if('values'infilePath): hasRegionLimit=('r'==filePath[-3:-2]) if(hasRegionLimit): basicLanguage=filePath[0:-4] if(notpath.exists(basicLanguage)): returnNone belongsToEnglish= ("values-en"inbasicLanguage) if(belongsToEnglish): #Comparewiththeres/values/strings.xml return(path.dirname(basicLanguage)+'/values/strings.xml',filePath+"/strings.xml") else: return(basicLanguage+'/strings.xml',filePath+"/strings.xml") returnNone
defgenLangPair(filePath): defshouldGenLanPair(filePath): if(not'values'infilePath): returnFalse if('dpi'infilePath): returnFalse if('dimes'infilePath): returnFalse if('large'infilePath): returnFalse returnTrue
if(shouldGenLanPair(filePath)): basicLanguage=path.dirname(filePath)+'/values/strings.xml' targetLanguage=filePath+'/strings.xml' if(notpath.exists(targetLanguage)): returnNone
if(notpath.samefile(basicLanguage,targetLanguage)): return(basicLanguage,targetLanguage) returnNone
defgenCompareList(filePath): compareLists=[] forfileinlistdir(filePath): regionPair=genRegionLangPair(filePath+'/'+file) if(None!=regionPair): compareLists.append(regionPair)
languagePair=genLangPair(filePath+'/'+file) if(None!=languagePair): compareLists.append(languagePair)
returncompareLists
defgetXmlEntries(filePath): root=ET.ElementTree(file=filePath).getroot() entries={} forchildinroot: attrib=child.attrib if(None!=attrib): entries[attrib.get('name')]=child.text print'xmlEntriesCount',len(entries) returnentries
defrewriteRegionFile(sourceEntries,filePath): if(notpath.exists(filePath)): return ET.register_namespace('xliff',"urn:oasis:names:tc:xliff:document:1.2") tree=ET.ElementTree(file=filePath) root=tree.getroot() printroot totalCount=0 removeCount=0 unRemoveCount=0 printlen(root) toRemoveList=[] forchildinroot: 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 printchildName,sourceEntries.get(childName),child.text printfilePath,totalCount,removeCount,unRemoveCount
foraItemintoRemoveList: root.remove(aItem)
if(len(root)!=0): tree.write(filePath,encoding="UTF-8") else: command='rm-rf%s'%(path.dirname(filePath)) printcommand system(command)
defmain(projectDir): lists=genCompareList(projectDir+"/res/")
foriteminlists: printitem src=item[0] dest=item[1] rewriteRegionFile(getXmlEntries(src),dest)
if__name__=="__main__": if(len(argv)==2): main(argv[1])