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生成器generator用法实例分析
Jun 04 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
Python数据结构与算法之完全树与最小堆实例
Dec 13 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python实现ID3决策树算法
Aug 29 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
Flask框架路由和视图用法实例分析
Nov 07 Python
Python代码块及缓存机制原理详解
Dec 13 Python
Python猜数字算法题详解
Mar 01 Python
python 实现端口扫描工具
Dec 18 Python
pytest配置文件pytest.ini的详细使用
Apr 17 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与javascript对多项选择的处理
2006/10/09 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
JavaScript中0和""比较引发的问题
2016/05/26 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
js 函数性能比较方法
2020/08/24 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
你懂得怎么写自荐信吗?
2013/12/27 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
公司离职证明标准样本
2014/10/05 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
职代会闭幕词
2015/01/28 职场文书
化验室岗位职责
2015/02/14 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android