背景
现在市面上大部分应用都做了国际化,中英文双语,对于大型应用可能有好几百页面,成千上万种场景,仅靠功能测试去检测英文翻译的正确性可能覆盖面不够全,且人眼看大段英文极易看错。所以开发脚本来做这个工作
方法
1.每个页面遍历UI控件获取text检测,这种方式效率较低,且也是很多场景异常提示等不容易触发到而遗漏
2.直接检测整个代码文件夹,遍历所有翻译文件查看英文拼写错误,这种方式效率高,不容易遗漏,但也有个缺点,无法检测到哪些没有翻译,只能检测到已经翻译的是否拼写正确
其中Android:扫描String_XXX.xml文件,并解析xml
IOS:扫描.strings后缀文件,并读取解析数据
脚本和代码
库:python库 安装 pyenchant
pip install pyenchant 如果这种方式安装不上,可尝试直接在pycharm插件中安装
主要脚本代码SpellCheck.py
from enchant.checker import SpellChecker
import sys
import os
import xml.etree.cElementTree as eT
#cmd运行时报模块找不到,所以把当前目录的其它模块导入
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from tools.Logger import Logger
def check_string(dir_path, src_type):
file_list = os.listdir(dir_path)
for cur_file in file_list:
# 获取文件的绝对路径
path = os.path.join(dir_path, cur_file)
if os.path.isfile(path):
if is_android_lang_file(cur_file): # 判断是否是Android字符配置文件
check_android_english(path)
if os.path.isdir(path) and not cur_file.startswith('.'):
check_string(path, src_type) # 递归子目录
def check_android_english(file_path):
if file_path.__contains__('values-zh'):
return
tree = eT.parse(file_path)
root = tree.getroot()
checker = SpellChecker('en_US')
strings = root.findall('.//string')
logger.info('开始检查 {0}-错误如下:'.format(file_path))
for string in strings:
if not string.text or check_contain_chinese(string.text):
return
checker.set_text(string.text)
for error in checker:
logger.info(error.word)
def is_android_lang_file(cur_file):
file_name = os.path.splitext(cur_file)[0]
file_suffix = os.path.splitext(cur_file)[1]
if file_suffix == '.xml' and file_name.startswith('string'):
return True
else:
return False
def check_contain_chinese(check_str):
for ch in check_str:
if u'\u4e00' <= ch <= u'\u9fff':
return True
return False
if __name__ == '__main__':
logger = Logger(logger='CheckEnglishString').get_log()
check_string(sys.argv[1], 'android')
检查IOS代码及RN的代码中英文配置文件拼写问题
def check_ios_english(file_path):
# f = open(file_path, 'rb', encoding='UTF-8')
logger.info('开始检查 {0} 错误如下:'.format(file_path))
with open(file_path, 'r', encoding='unicode_escape') as fp:
lines = fp.readlines()
checker = SpellChecker('en_US')
for string in lines:
words = string.split('=', 1)
if len(words) > 1:
word = words[1].replace('"', '')
if not word or check_contain_chinese(word):
return
checker.set_text(word)
for error in checker:
logger.info(error.word + ' 【' + word+'】')
def check_rn_english(file_path):
# f = open(file_path, 'rb', encoding='UTF-8')
logger.info('开始检查 {0} 错误如下:'.format(file_path))
with open(file_path, 'r', encoding='unicode_escape') as fp:
lines = fp.readlines()
checker = SpellChecker('en_US')
for string in lines:
words = string.split(':', 1)
if len(words) > 1:
word = words[1].replace('"', '')
word = words[1].replace("'", "")
if not word or check_contain_chinese(word):
return
checker.set_text(word)
for error in checker:
logger.info(error.word + ' 【' + word + '】')
输出日志及结果的Logger代码
# coding : utf-8
import logging
import os
import time
class Logger(object):
def __init__(self, logger):
self.logger = logging.getLogger(logger)
self.logger.setLevel(logging.INFO)
current_time = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
cur_path = os.path.abspath(os.path.dirname(__file__))
root_path = os.path.split(cur_path)[0]
log_name = root_path + '\\result\\' + current_time + '.txt'
file_handler = logging.FileHandler(log_name)
file_handler.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
formatter = logging.Formatter()
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
self.logger.addHandler(file_handler)
self.logger.addHandler(console_handler)
def get_log(self):
return self.logger;
代码目录

目录
生成的结果放在result中,会依次遍历所有文件并打印出哪个文件下的错误英文拼写
待优化
1.需要加入过滤单词库,有些缩写及公司内部专用英文缩写需要过滤