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中logging模块的用法实例
Sep 29 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
Python 调用Java实例详解
Jun 02 Python
DataFrame中去除指定列为空的行方法
Apr 08 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
pycharm的console输入实现换行的方法
Jan 16 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
Python socket 套接字实现通信详解
Aug 27 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
next在python中返回迭代器的实例方法
Dec 15 Python
Python实现生成bmp图像的方法
Jun 13 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
javascript 短路法代码精简
2009/08/20 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
python实现批量图片格式转换
2020/06/16 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
大学生两会精神学习心得体会
2014/03/10 职场文书
市场营销策划方案
2014/06/11 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
Python 文字识别
2022/05/11 Python