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循环创建多个文件的方法
Oct 25 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
python实现电子产品商店
Feb 26 Python
详解python配置虚拟环境
Apr 08 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
详解pandas的外部数据导入与常用方法
May 01 Python
python实现倒计时小工具
Jul 29 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
Python 如何解决稀疏矩阵运算
May 26 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 similar_text 字符串的相似性比较函数
2010/05/26 PHP
php下批量挂马和批量清马代码
2011/02/27 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
php面向对象值单例模式
2016/05/03 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
什么是Python中的匿名函数
2020/06/02 Python
浅谈Python中的继承
2020/06/19 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
学校经典推荐信
2013/10/30 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
2014年幼师工作总结
2014/11/22 职场文书
公司借条范本
2015/05/25 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
Golang数据类型和相互转换
2022/04/12 Golang