视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python实现删除Android工程中的冗余字符串
2020-11-27 14:31:35 责编:小采
文档


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/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

下载本文
显示全文
专题