python扫描app代码检测英文翻译拼写正确性

背景

现在市面上大部分应用都做了国际化,中英文双语,对于大型应用可能有好几百页面,成千上万种场景,仅靠功能测试去检测英文翻译的正确性可能覆盖面不够全,且人眼看大段英文极易看错。所以开发脚本来做这个工作

方法

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.需要加入过滤单词库,有些缩写及公司内部专用英文缩写需要过滤

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容