Python实现删除Android工程中的冗余字符串


Posted in Python onJanuary 19, 2015

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
Python 相关文章推荐
剖析Python的Twisted框架的核心特性
May 25 Python
windows下python连接oracle数据库
Jun 07 Python
Python字典及字典基本操作方法详解
Jan 30 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
python实现Zabbix-API监控
Sep 17 Python
Python中垃圾回收和del语句详解
Nov 15 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
numpy.linspace函数具体使用详解
May 27 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
如何验证python安装成功
Jul 06 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 Python
Python中字典和JSON互转操作实例
Jan 19 #Python
Python中的字典遍历备忘
Jan 17 #Python
Python中处理unchecked未捕获异常实例
Jan 17 #Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 #Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 #Python
Python转换HTML到Text纯文本的方法
Jan 15 #Python
python中os操作文件及文件路径实例汇总
Jan 15 #Python
You might like
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
htm调用JS代码
2007/03/15 Javascript
javascript 写类方式之九
2009/07/05 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
javascript常见操作汇总
2014/09/03 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
Python的迭代器和生成器使用实例
2015/01/14 Python
python中的字典使用分享
2016/07/31 Python
详解python的数字类型变量与其方法
2016/11/20 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
python实现同一局域网下传输图片
2020/03/20 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
查看keras的默认backend实现方式
2020/06/19 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
大宝sod蜜广告词
2014/03/21 职场文书
初中作文评语集锦
2014/12/25 职场文书
库房管理员岗位职责
2015/02/12 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
创业计划书之熟食店
2019/10/16 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS