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通过正则查找微博@(at)用户的方法
Mar 13 Python
Python中的ceil()方法使用教程
May 14 Python
Python多进程机制实例详解
Jul 02 Python
Django小白教程之Django用户注册与登录
Apr 22 Python
Python中django学习心得
Dec 06 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
Django 配置多站点多域名的实现步骤
May 17 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
Python使用re模块验证危险字符
May 21 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 Python
基于Python的接口自动化读写excel文件的方法
Jan 15 Python
Python OpenCV快速入门教程
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 防注入函数(格式化数据)
2011/08/08 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
Python读写unicode文件的方法
2015/07/10 Python
python实现简单购物商城
2016/05/21 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
pytorch梯度剪裁方式
2020/02/04 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
双方协议书
2014/04/22 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript