项目需求
增加语言切换功能
存在问题
项目代码中,汉字直接使用,没有在string.xml中声明并引用。
全局查找并整理到string.xml中特别麻烦
解决思路
1.编写并使用python脚本整理出代码中出现的汉字。
2.整理出的汉字序列交给翻译人员,翻译,整理成文档(key-value形式)。
3.读取翻译文档,将翻译文档使用python脚本整理成strings.xml。
4.使用python脚本,将代码中的汉字替换成引用strings.xml中的形式。
实现
1.编写并使用python脚本整理出代码中出现的汉字。
import os
import re
# 汉字集合
chinesSet = set()
# 查找汉字
def findChinese(path):
with open(path, 'r', encoding='utf8') as javaFile:
content = javaFile.read()
# java代码中查找汉字
# findP = r'\"([\u4E00-\u9FA5,]+)\"'
# layout文件中查找汉字
findP = r'android:text=\"([\u4E00-\u9FA5,]+)\"'
results = re.compile(findP).findall(content)
# 将查找到的汉字添加到set中,set自重去重
for hanz in results:
chinesSet.add(hanz)
# 遍历并查找文档
def search_dir(rootPath):
list = os.listdir(rootPath) # 列出文件夹下所有的目录与文件
for i in range(0, len(list)):
path = os.path.join(rootPath, list[i])
if os.path.isfile(path):
# 是文件,进入文件,查找
findChinese(path)
else:
# 是文件夹,进入文件夹,递归
search_dir(path)
# 代码路径
rootdir = 'layout'
search_dir(rootdir)
print(chinesSet)
2.整理出的汉字序列交给翻译人员,翻译,整理成文档(key-value形式)。
拿到翻译文档在进行下一步
3.读取翻译文档,将翻译文档使用python脚本整理成strings.xml。
文档内容如下
# 保存到的xml文件路径
fileNameXml = 'stringsen2.xml'
# 文档路径
fileNameTxt = 'en_2.txt'
# 写入到xml中
def writeInfoToXml(key, value):
with open(fileNameXml, 'a', encoding='utf8') as stringFile:
line = '<string name="' + key + '">' + value + '</string>\n'
stringFile.writelines(line)
with open(fileNameTxt, 'r', encoding='GBK') as enFile:
lines = enFile.readlines()
with open(fileNameXml, 'a', encoding='utf8') as stringFile:
line = '<?xml version="1.0" encoding="utf-8"?>\n'
stringFile.writelines(line)
stringFile.writelines('<resources>\n')
for line in lines:
# 去除乱七八糟的符号
line = line.replace('\"', '').replace(';', '').replace('\n', '')
print(line)
c = line.split('=')
writeInfoToXml(c[0].replace('-', '_'), c[1])
with open(fileNameXml, 'a', encoding='utf8') as stringFile:
stringFile.writelines('</resources>\n')
4.使用python脚本,将代码中的汉字替换成引用strings.xml中的形式。
import os
import xml.etree.ElementTree as ET
# 查找汉字
def findChinese(path, txt, name):
# StringUtils.getString(R.string.t_submit)
# 这个是我自己使用string文件的工具,具体代码可自行替换
with open(path, 'r', encoding='utf8') as javaFile_r:
content = javaFile_r.read()
with open(path, 'w', encoding='utf8') as javaFile_w:
content = content.replace('\"' + txt + '\"', 'StringUtils.getString(R.string.' + name + ')')
javaFile_w.write(content)
# 遍历并查找文档
def search_dir(rootPath, txt, name):
list = os.listdir(rootPath) # 列出文件夹下所有的目录与文件
for i in range(0, len(list)):
path = os.path.join(rootPath, list[i])
if os.path.isfile(path):
findChinese(path, txt, name)
else:
search_dir(path, txt, name)
# 读取string.xml
def read_xml(in_path):
"""读取并解析xml文件
in_path: xml路径
return: tree"""
tree = ET.parse(in_path)
return tree
# 代码路径
rootdir = 'turtle'
xmlPath = 'strings_zh.xml'
tree = read_xml(xmlPath)
root = tree.getroot()
for e in root:
search_dir(rootdir, e.text, e.attrib['name'])
print(e.text, e.attrib['name'])