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中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
python计算对角线有理函数插值的方法
May 07 Python
python中的编码知识整理汇总
Jan 26 Python
python mysql断开重连的实现方法
Jul 26 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
手把手教你配置JupyterLab 环境的实现
Feb 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
php下使用SMTP发邮件的代码
2008/01/10 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
javascript add event remove event
2008/04/07 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
vue中实现动态生成二维码的方法
2020/02/21 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
深入理解Django的自定义过滤器
2017/10/17 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
PHP如何自定义函数
2016/09/16 面试题
会计电算化专业毕业生自荐信
2013/12/20 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
小学生教师节广播稿
2015/08/19 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js