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多线程操作实例
Nov 21 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Django中login_required装饰器的深入介绍
Nov 24 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
python滑块验证码的破解实现
Nov 10 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
通过python连接Linux命令行代码实例
Feb 18 Python
学习Python爬虫的几点建议
Aug 05 Python
python3中TQDM库安装及使用详解
Nov 18 Python
python 实现Harris角点检测算法
Dec 11 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文件上传主要代码讲解
2013/09/30 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
Python写的Socks5协议代理服务器
2014/08/06 Python
Python类属性与实例属性用法分析
2015/05/09 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
python判断正负数方式
2020/06/03 Python
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
电气工程师岗位职责
2014/01/01 职场文书
总经理司机职责
2014/02/02 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
安全生产计划书
2014/05/04 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
先进个人自荐书
2015/03/06 职场文书
离婚代理词范文
2015/05/23 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
Django REST framework 限流功能的使用
2021/06/24 Python
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers