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对象的深拷贝和浅拷贝详解
Aug 25 Python
Python操作MySQL简单实现方法
Jan 26 Python
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
Python获取当前路径实现代码
May 08 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
Python闭包和装饰器用法实例详解
May 22 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
python提取log文件内容并画出图表
Jul 08 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 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读取30天之内的根据算法排序的代码
2008/04/06 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
海量经典的jQuery插件集合
2010/01/12 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
深入了解python列表(LIST)
2020/06/08 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
什么是java序列化,如何实现java序列化
2012/11/14 面试题
输入N,打印N*N矩阵
2012/02/20 面试题
database面试题
2013/03/28 面试题
法学个人求职信范文
2014/01/27 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
2014植树节活动总结
2014/03/11 职场文书
房屋买卖协议书
2014/04/10 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
公证处委托书
2015/01/28 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技
mysql sock文件存储了什么信息
2022/07/15 MySQL