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(Tornado)模拟登录小米抢手机
Nov 12 Python
深入浅析Python字符编码
Nov 12 Python
Python 如何访问外围作用域中的变量
Sep 11 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
python爬虫之urllib3的使用示例
Jul 09 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
python django model联合主键的例子
Aug 06 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
python 多维高斯分布数据生成方式
Dec 09 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
python实现logistic分类算法代码
Feb 28 Python
Python实现疫情地图可视化
Feb 05 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
CI框架安全类Security.php源码分析
2014/11/04 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
php实现的二分查找算法示例
2017/06/20 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Django视图和URL配置详解
2018/01/31 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
会走路的树教学反思
2014/02/20 职场文书
村干部承诺书
2014/03/28 职场文书
应急处置方案
2014/06/16 职场文书
贷款委托书怎么写
2014/08/02 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
三方合作意向书范本
2015/05/09 职场文书
政工师工作总结2015
2015/05/26 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
logback 实现给变量指定默认值
2021/08/30 Java/Android