软件多语言文案脚本自动化方案

这篇具有很好参考价值的文章主要介绍了软件多语言文案脚本自动化方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发高效提速系列目录

  1. 软件多语言文案脚本自动化方案

博客创建时间:2023.05.03
博客更新时间:2023.05.03

以Android studio gradle=7.5,SDKVersion 32来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已。


背景

在海外项目中多语言的支持是很重要的一部分。在我们的项目中常常需要支持简中、繁体、英、日、韩、西班牙语等十多种语言,当我们进行文案的新增、修改、删除时,需要在软件项目多语言文案资源文件中进行文案Key和文案内容对应的复制粘贴,非常耗时耗力且容易出现疲劳性错误。

目前关于多语言文案的管理,有部分公司的项目管理可能还停留在如下流程中:

  1. 文案由开发在项目资源文件中进行维护(如Android的strings.xml、IOS的Localizable.strings、PC云端的XXX.ini ),当需要进行文案翻译时,将文案文件语言.xml文件给到产品经理
    软件多语言文案脚本自动化方案

  2. 由产品经理经过其他操作对文案进行翻译,提供多语言翻译后的excel文档给到软件开发,此时文案Key和文案内容失去关联关系
    软件多语言文案脚本自动化方案

  3. 软件开发根据给到的翻译内容查找到对应的文案Key,然后复制到对应的资源文件中进行文案的更新操作

该流程实现过程中,会出现可能的几点问题:

  1. 在版本开发迭代期间,频繁的文案新增修改,需要开发人员频繁手动对齐文案和Key的关系,费时费力
  2. 每一中语言都需要将操作重复进行一遍,语言种类越多耗时越久且手动复制粘贴中容易出现疲劳性错误

目标

为了方便对文案资源进行统一管理,方便产品、开发、测试对文案内容的统一对齐,应该在已有的翻译excel文档的基础上完善文案,对每条文案新增对应的文案Key,同时采用python脚本方法,实现脚本自动化程序更新文案资源,达到提升文案管理和使用效率提升。该方案可以支持Android、IOS、PC云端项目的。

整体方案

该方案的主要思路是:

  1. 创建好统一管理Android、IOS或PC 云端项目的文案管理excel文件
  2. 根据文案资源Excel文件进行python脚本的编写,达到执行脚本时能生成不同格式的文案资源文件
  3. 当文案资源有更新时,在excel文档中进行更新,执行脚本程序完成文案资源的更新
    软件多语言文案脚本自动化方案

根据思路我将其细分为如下几个细分步骤:

  1. 建立标准化文案管理文件。一般是用excel文件管理
  2. 编写Python脚本开发
  3. Python文件管理与程序触发执行
  4. 项目组内人员职责分配

1. 创建文案资源文件

多语言文案可以放在某个excel文件中进行管理,一般使用公司的办公软件如钉钉或飞书软件中进行管理。文案资源的格式可以一般同产品沟通协商共同制作,符合自己公司产品的需求即可,我这里给出移动端文案sheet和PC 云端sheet模板样式,云端和移动端因文案差异太大,建议不用放在一起。
软件多语言文案脚本自动化方案
软件多语言文案脚本自动化方案
软件多语言文案脚本自动化方案

注意:多语言的文案翻译根据软件的实际需求进行使用,如软件不支持某种语言如"土耳其语",将其对应列空着即可。

2. python脚本开发

python脚本代码如下

# coding=utf-8
import importlib
import re
import sys
import os
import xlrd2

importlib.reload(sys)
# isAndroid = True
ANDROID = "Android"
IOS = "IOS"
PC = "PC"
# 配置文件修改区 START *****/
# 平台类型 Android、IOS、PC 区分大小写
platformType = "Android"

# 项目多语言资源文件
excelPath = os.path.expanduser('~/Downloads/多语言文案.xlsx')
# 输出路径
outputPath = "D:/Ken.Luo/res/"

# 选择需要导出文案的sheet名
sheetName = "App文案"
# 配置文件修改区 END *****/


# 导出文案的类型
# entryType = "Android"
commentColNum = 4
typeColNum = 2
keyColNum = 2
colToStringsMap = None


# 切换到iOS
def switchToAndroid():
    global keyColNum, colToStringsMap
    keyColNum = 2
    # 对应关系元组Android (列数 : 多语言文件)
    colToStringsMap = [(7, "values/strings.xml"),
                       (5, "values-zh/strings.xml"),
                       (6, "values-zh-TW/strings.xml"),
                       (8, "values-de/strings.xml"),
                       (9, "values-fr/strings.xml"),
                       (10, "values-es/strings.xml"),
                       (11, "values-ja/strings.xml"),
                       (12, "values-ko/strings.xml"),
                       (13, "values-ar/strings.xml"),
                       (14, "values-it/strings.xml"),
                       (15, "values-pt/strings.xml"),
                       (16, "values-tr/strings.xml"),
                       (17, "values-ru/strings.xml")]


# 切换到iOS
def switchToIOS():
    global keyColNum, colToStringsMap
    keyColNum = 3
    colToStringsMap = [(7, "values/Localizable.strings"),
                       (5, "values-zh/Localizable.strings"),
                       (6, "values-zh-TW/Localizable.strings"),
                       (8, "values-de/Localizable.strings"),
                       (9, "values-fr/Localizable.strings"),
                       (10, "values-es/Localizable.strings"),
                       (11, "values-ja/Localizable.strings"),
                       (12, "values-ko/Localizable.strings"),
                       (13, "values-ar/Localizable.strings"),
                       (14, "values-it/Localizable.strings"),
                       (15, "values-pt/Localizable.strings"),
                       (16, "values-tr/Localizable.strings"),
                       (17, "values-ru/Localizable.strings")]

def switchToPC():
    global keyColNum, colToStringsMap
    keyColNum = 2
    colToStringsMap = [(7, "values/strings.ini"),
                       (5, "values-zh/strings.ini"),
                       (6, "values-zh-TW/strings.ini"),
                       (8, "values-de/strings.ini"),
                       (9, "values-fr/strings.ini"),
                       (10, "values-es/strings.ini"),
                       (11, "values-ja/strings.ini"),
                       (12, "values-ko/strings.ini"),
                       (13, "values-ar/strings.ini"),
                       (14, "values-it/strings.ini"),
                       (15, "values-pt/strings.ini"),
                       (16, "values-tr/strings.ini"),
                       (17, "values-ru/strings.ini")]



# ******* #

def formatValue(originalStr):
    ''' 格式化字符串成为app 程序需要的样子'''
    print("originalStr:" + originalStr)

    # excel中的换行符换成 \n转义字符, 文案首尾的换行符认为是翻译人员不小心按出来的,在此去掉
    originalStr = re.sub(r'\n+$', "", originalStr, re.S)
    originalStr = re.sub(r'^\n+', "", originalStr, re.S)
    originalStr = re.sub(r'\n', "\\\\n", originalStr, re.S)
    # 安卓需要对&进行处理
    if platformType is ANDROID:
        #  不处理,待后续直接替换成空格
        if originalStr != ' ':
            originalStr = re.sub(r'&', "&", originalStr, re.S)

    print("")
    return originalStr


### 写多语言文件函数 ###
def write_header(strFile):
    if platformType is ANDROID:
        strFile.write("""<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">\n""")


def write_trailer(strFile):
    if platformType is ANDROID:
        strFile.write("\n</resources>")


def write_comment(strFile, comment):
    '''生成注释文案'''
    if comment != "" and comment != None:
        if platformType is ANDROID:
            strFile.write("\t<!-- " + str(comment) + "-->\n")
        elif platformType is IOS:
            strFile.write("/** " + str(comment) + " */\n")
        elif platformType is PC:
            strFile.write("# " + str(comment) + " \n")


def write_key_value(strFile, key, value, defaultValue):
    # iOS对于value是空使用defaultValue
    if value == "&nbsp;":
        value = " "
    if not typeColNum is ANDROID and (value is None or value == ""):
        value = defaultValue

    if key is None or key == "" or value is None or value == "":
        return
    # 处理一个文案多个key的情况
    keyColValues = key.splitlines()
    for keyColValue in keyColValues:
        if platformType is ANDROID:
            strFile.write("\t<string name=\"" + keyColValue.strip() + "\">" + value.strip() + "</string>\n")
        elif platformType is IOS:
            strFile.write("\"" + keyColValue.strip() + "\" = \"" + value.strip() + "\";\n")
        elif platformType is PC:
            strFile.write(keyColValue.strip() + " = \"" + value.strip() + "\";\n")


# ******* #
workbook = xlrd2.open_workbook(excelPath)
table = workbook.sheet_by_name(sheetName)


def writeToFiles():
    nrows = table.nrows
    # 打开文件
    colToFileMap = []

    for (col, fileName) in colToStringsMap:
        paths = os.path.split(fileName)
        print("paths 路径", paths)
        if len(paths) > 1:
            pathDir = outputPath + paths[0]
            print("dir 路径", pathDir)

            # 输出目录文件夹不存在就创建
            if not (os.path.exists(pathDir)):
                os.makedirs(pathDir)

        file = open(outputPath + fileName, "w+", 1024, "utf-8")
        colToFileMap.append((col, file))
        write_header(file)

    # 导出文案
    for i in range(2, nrows):
        print(table)
        comment = table.cell(i, commentColNum).value
        typeColValue = table.cell(i, typeColNum).value
        keyColValue = table.cell(i, keyColNum).value
        defaultValue = ""

        # 将一行的各列写入对应的多语言文件
        for (col, strFile) in colToFileMap:
            value = table.cell(i, col).value
            value = formatValue(value)
            if col == colToFileMap[0][0]:
                defaultValue = value

            write_comment(strFile, comment)
            # if typeColValue.find(entryType) >= 0:
            write_key_value(strFile, keyColValue, value, defaultValue)

    # 关闭文件
    for (_, file) in colToFileMap:
        write_trailer(file)
        file.close()


if __name__ == '__main__':
    if platformType is ANDROID:
        switchToAndroid()
        writeToFiles()
    elif platformType is IOS:
        switchToIOS()
        writeToFiles()
    elif platformType is PC:
        switchToPC()
        writeToFiles()

3. Python脚本执行与管理

Python脚本的执行需要在电脑中进行触发程序执行,需要电脑有python运行环境,我使用的是Pycharm idea软件,一键安装即可用,和Android studio使用是一样的。后面会专门讲解PyCharm的使用操作。

参数配置
当执行软件安装好后,需要进行部分参数的配置,配置完参数后即可进行程序的执行,生成对应的资源文件。

ANDROID = "Android"
IOS = "IOS"
PC = "PC"
# 配置文件修改区 START *****/
# 平台类型 Android、IOS、PC 区分大小写
platformType = "PC"

# 项目多语言资源文件
excelPath = os.path.expanduser('~/Downloads/Remo文案汇总.xlsx')
# 输出路径
outputPath = "D:/Ken.Luo/res88888/"

# 选择需要导出文案的sheet名
sheetName = "APP文案"
# 配置文件修改区 END *****/

主要修改的是参数为

  1. platformType:资源使用的平台,目前定义有Android、IOS、PC云端
  2. excelPath :excel资源文件的目录地址
  3. outputPath:脚本执行后的生成的输出位置
  4. sheetName :APP和PC云端的文案资源我设计是分开放的,所以是两个sheet,需要执行程序时手动选择

执行效果
以Android举例,多语言文案资源是放置在res/value/strings.xml文件中下的。现在我们预计通过执行python脚本程序,实现文案内容自动更新到各语言的strings.xml中。
软件多语言文案脚本自动化方案
脚本管理
python脚本是为了减少开发进行文案更新时提效的,当脚本程序开发完毕后考虑后期可能有优化,需要对齐进行持久化管理,所以首先想到的是使用gitee进行管理。https://gitee.com/luofaxin/LanguageRes.git

4. 人员职责分配

在多语言文案管理中,不同角色有自己的任务分配
软件多语言文案脚本自动化方案

PyCharm使用说明

在python脚本准备好后,需要通过某种方式实现程序的触发,第一阶段先考虑手动操作pycharm程序执行脚本程序,后期也可以考虑在服务器上进行脚本的自触发。

1. PyCharm下载

手动触发方式需要使用者安装Pycharm 软件,用于执行文案脚本程序。https://www.jetbrains.com/pycharm/download/#section=windows
软件多语言文案脚本自动化方案

2. PyCharm安装配置

软件多语言文案脚本自动化方案

  1. 配置.py运行环境
    软件多语言文案脚本自动化方案
    软件多语言文案脚本自动化方案

  2. 配置脚本执行变量
    对于.py文件,需要动态的更改路径的配置
    软件多语言文案脚本自动化方案

  3. 执行脚本程序
    点击执行脚本程序,python脚本将会自动执行,将excel文件生成res/strings.xml文件
    软件多语言文案脚本自动化方案

3. 异常情况解决

  1. Python ModuleNotFoundError: No module named ‘xlrd‘ 异常
    解决方案
    软件多语言文案脚本自动化方案
    软件多语言文案脚本自动化方案

总结

希望这个python脚本自动化方案能帮助大家,多语言文案资源和pyhton脚本我都放到gitee仓库中了,可以下载使用。欢迎大家提出更好的优化建议。
仓库地址:https://gitee.com/luofaxin/LanguageRes.git


相关链接

  1. 软件多语言文案脚本自动化方案

扩展链接:

  1. 项目开发混淆从初识到理解
  2. 项目开发代码分支管理

博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !文章来源地址https://www.toymoban.com/news/detail-436545.html

到了这里,关于软件多语言文案脚本自动化方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MacOS - 简体中文输入法卡死解决方案(自动化脚本)

    本文使用自动化工具创建应用程序来一键运行脚本重启简体中文输入法的进程,从而解决macOS的假死问题。如果只想看看解决方法的话,可以跳转到“使用‘自动化’工具建立应用程序”段落。 我的电脑使用习惯可谓是很差,软件一直常驻后台,电脑几乎除了系统更新都不关

    2024年01月18日
    浏览(62)
  • 自动化脚本不稳定,原来是软件弹窗惹的祸,2个方法解决!

    很多同学在学习 App 自动化或者在项目中落地实践 App 自动化时,会发现编写的自动化脚本无缘无故的执行失败、不稳定。 而导致其问题很大原因是因为应用的各种弹窗(升级弹窗、使用过程提示弹窗、评价弹窗等等),比如这样的: 前言   如果不对这些弹窗进行处理,将会

    2024年04月22日
    浏览(35)
  • 易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队

    在当今快速发展的信息化时代,企业对于高效、自动化的软件需求日益增长。而易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队,正是为了满足这一需求而诞生的。 一、团队背景 技术顾问、维:Daxiami6789 易语言软件定制开发爬虫模拟协议填写自动化办公

    2024年02月05日
    浏览(72)
  • 【软件测试】- 将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中实现自动化测试和持续集成(CI)及Jenkinsfile 实现 Jenkins Pipeline 原理介绍

    将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中是实现自动化测试和持续集成(CI)的关键步骤。以下是详细的集成过程: 1、准备工作 安装 Jenkins : 确保您已经在服务器上安装了 Jenkins。 可以从 Jenkins 官网 下载并安装。 安装必要的插件 : 在 Jenkins 中安装所需的插件,如 Git 插

    2024年02月04日
    浏览(73)
  • 自动化操作脚本

    SSH连接并执行指令操作 MQTT服务器启动

    2024年02月05日
    浏览(46)
  • Postman-脚本自动化及定时执行脚本(7)

    一.postman脚本自动化 ( 从postman至Newman可以一键执行脚本并生成报告: ) Postman Newman 是一个 CLI(命令行界面)工具,可以使用它来运行 Postman 中的集合(Collection)和环境(Environment)进行自动化测试。postman使用newman插件完成命令执行postman脚本。**(1)newman按装** 1.Newman安

    2024年01月21日
    浏览(49)
  • Jenkins自动化打包脚本

    jenkins可以设置定时任务打包,也已手动点按钮打包,还可以通过执行http请求打包,今天我们就通过shell脚本,通过curl命令进行jenkins打包。 2.1 在jenkins上构建项目 设置触发器

    2024年02月13日
    浏览(43)
  • 自动化防DDoS脚本

    DDoS (分布式拒绝服务攻击)是一种恶意的网络攻击,旨在通过占用目标系统的资源,使其无法提供正常的服务。在DDoS攻击中,攻击者通常控制大量的被感染的计算机或其他网络设备,同时将它们协调起来向目标系统发起海量的请求,超出其处理能力范围,导致服务不可用。

    2024年01月25日
    浏览(38)
  • [Python自动化]使用Python Pexpect模块实现自动化交互脚本使用心得

    参考文档:https://pexpect.readthedocs.io/en/stable/ 在最近的工作中,需要使用DockerFile构建镜像。在构建镜像的过程中,有一些执行的命令是需要交互的。例如安装 tzdata (apt install tzdata),不过在使用apt安装时,可以直接使用 DEBIAN_FRONTEND=noninteractive 前缀来取消交互(至于是禁止交互还

    2023年04月25日
    浏览(48)
  • 自动化测试脚本编写(超详细)

    🍅 视频学习: 文末有免费的配套视频可观看 🍅  关注公众号【互联网杂货铺】,回复 1  ,免费获取软件测试全套资料,资料在手,涨薪更快 什么是自动化测试? 自动化测试是验证和验证软件是否满足所有用户需求,并使用自动化工具按预期运行。它检查在产品开发阶段

    2024年04月26日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包