赶走那些Android工程中得冗余字符串

Android提供了一套很方便的进行资源(语言)国际化机制,为了更好地支持多语言,很多工程的翻译往往会放到类似crowdin这样的平台上。资源是全了,但是还是会有一些问题。

哪些问题

以下使用一些语言进行举例。其中values为工程默认的资源。

  • 某语言的资源和某语言限定区域的资源之间。如values-fr-rCA存在于values-fr相同的字符串,这种表现最为严重。
  • 某语言的资源和默认的资源之间。values-fr存在与values相同的字符串,可能原因是由于values-fr存在未翻译字符串导致

为什么要去重

  • 洁癖,容不下半点冗余。

解决思路

  • 如果values-fr-rCA存在于values-fr相同的字符串,去除values-fr-rCA中的重复字符串,保留values-fr。这样可以保证在values-fr-rCA下也可以正确读取到资源。
  • 如果values-fr存在与values相同的字符串。如去除values-fr中得重复字符串,保留values的条目。

Py脚本

filenos:false removeRepeatedStrings.pylink

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123

#!/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])

如何使用

filenos:false

1

python removeRepeatedStrings.py your_android_project_root_dir

工程参与

RemoveRepeatedStrings.py

其他

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据分析

[数据库基础]——索引详解

索引对于接触过数据库的人,都不会很陌生,但是说实话,也不一定很熟悉。先来介绍下索引的优点。 提高性能 现在有一个数据库表[Words],有[WordID],[W...

36260
来自专栏程序猿成长计划

MySQL之ROUND函数四舍五入的陷阱

在MySQL中,ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本文将这一问题记录下来,以免大家跟我一样...

48840
来自专栏简书专栏

mysql必知必会2

语法:delete from {1} where {2} 第一对大括号替换为表名,第二对大括号替换为查询条件。 注意:删除语句一定要写删除条件,否则整张表删...

13320
来自专栏文渊之博

参数化(二):执行查询的方式

前面一篇我介绍了执行计划缓存以及执行之前批处理经过的流程。这篇将用几个最普通的例子介绍查询的几种执行方式。 请看下面这个我使用的这个查询: SELECT Id...

18780
来自专栏c#开发者

Oracle 最常用功能函数经典汇总

Oracle 最常用功能函数经典汇总 SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(...

44470
来自专栏数说戏聊

01-03章 检索排序数据第1章 了解SQL第2章 检索数据第3章

数据库(database) 数据库软件称为数据库管理系统(DBMS),数据库是通过 DBMS 创建和操纵的容器。

7210
来自专栏恰童鞋骚年

《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

  数据库在物理上由数据文件和事务日志文件组成,每个数据库必须至少有一个数据文件和一个日志文件。

10650
来自专栏Java呓语

第11章、数据类型

关键字 INT 是 INTEGER 的别名,关键字 DEC 和 FIXED 是 DECIMAL的别名。 在 MyISAM/MEMORY/InnoDB和NDB表...

11220
来自专栏技术专栏

SQL 编写技巧总结(持续更新中)

参考 http://blog.csdn.net/bitcarmanlee/article/details/51926530

20030
来自专栏Leetcode名企之路

【Leetcode】175. 组合两个表

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

9610

扫码关注云+社区

领取腾讯云代金券