背景
由于业务需要拓展海外版本,意味着要支持多语言的显示。最开始我们把项目需要的所有语言资源,都放在项目本地维护,但后来遇到不少问题。比如,项目会有多条分支如生产分支、测试分支、以及其余版本分支,每条分支的多语言资源不尽相同。当时需要研发手动维护,多语言翻译回来时需要研发提 MR,此时会产生一定的冲突以及额外的工作量,测试也需要定期进行回归,投入的人力高,整体效率较低。于是需要一个方案,能解放一定程度的人力,减少重复劳动工作。
半自动化
我们需要把多语言资源整理成 excel 表格,提交给第三方团队翻译。翻译完成后,需要根据 excel 表格的内容,同步为代码文件。这个过程都是手工重复性劳动,我们能否做一个工具,可以使 excel 内容与代码文件之间快速转换呢?答案是肯定的,本人做了个简单快捷的工具,源码在这里 Github。下面简单介绍下用法。
把代码文件导出为 excel
- 将多语言文件夹放入项目
exports目录下(不一定得是这个,可根据命令参数自定义路径),文件应遵循 CMD 格式 - 执行基本命令
node export.js输出 excel 到同级目录
可以携带额外参数,格式为:node export.js key1=value1 key2=value2
| 参数名称 | 说明 | 默认值 |
|---|---|---|
| inputDir | 要扫描的资源文件夹 | ./exports |
| base | 基准语言名称 | zh-CN |
| outputFileName | 输出的 excel 文件名(无需带扩展名) | file |
| sheetName | excel 中的表名称 | i18n |
举例:node export.js outputFileName=project inputDir=i18n。
输出 excel 的 sheet 的格式例子如下:
| file | key | zh-CN | zh-TW | en-US |
|---|---|---|---|---|
| index.js | base.all | 所有 | all | |
| components/Button.js | base.close | 关闭 | 關閉 | |
| components/Icon.js | base.rename | 重命名 |
表头第一列是 file,下面是文件名字,前面会有文件夹路径,第二列是 key,下面是基准语言所有文案资源对应的路径(不存在送翻语言有而基准语言无的路径),第三列是基准语言名称,后面的所有列皆为送翻的语言名称,它们下面对应的是该语言在该 key 下的文案,如果存量文件存在翻译,则取之自动填充,否则置空。
注意:
- 生成 excel 中的 key,均对齐基准语言的内容。若其他语言中有 key1,而基准语言中无 key1,则生成的 excel 中不会有 key1。也就是说:key 完全取自基准语言,value 取多语言的值。
- 多语言文件可以是遵循 CommonJS 格式的无依赖的 js 文件,但最好是 JSON 文件。
把 excel 导入为代码文件
执行基本命令 node import.js inputFile=./xxx.xlsx 输出文件至指定目录。可以携带额外参数,格式为:node import.js key1=value1 key2=value2。
| 参数名称 | 说明 | 默认值 |
|---|---|---|
| inputFile | excel 文件路径 | ./file.xlsx |
| outputDir | 输出的资源文件夹路径 | ./imports |
举例:node import.js inputFile=./project.xlsx outputDir=./locales。
自动化
以上的工具做到了源文件与 excel 之间的快速转换,已经减轻不少开发的工作量。但是每个项目需要维护自身的多语言资源,无法集中统一管理,而且仍存在一些人工参与的流程。是否有更优的方案呢?这里分享下实际工作中该方案的大致思路。
在该方案下,每个业务项目只需维护基准语言资源(中文简体)即可。另外有个公用 i18n 服务,负责管理项目多语言资源。这些资源都会交到一个公用独立代码仓库中维护,这个仓库类似于数据库的作用,它拥有所有项目所有分支的多语言资源。
在项目开发阶段,由于本地只有基准语言资源,无其他多语言资源,需要从源码层面兼容这种情况,改造成本很小是可接受的。
在项目部署前,先从 i18n 服务请求多语言数据,然后转化成项目代码文件放在指定目录下(该功能可参考上面半自动化的工具),此时项目文件才是完整的,方可进入构建阶段。
sequenceDiagram
title: 项目构建阶段
project->>i18n service: 请求资源
i18n service->>i18n hub: 调取数据
i18n hub->>i18n service: 返回数据
i18n service->>project: 返回资源
如果第三方团队更新了翻译的 excel 内容,经过审核(可人工也可自动审核)后,把 excel 转化成项目文件入库。转化功能同理参考半自动化工具,入库则可请求 i18n 服务。
sequenceDiagram
title: 更新资源入库
i18n service->>i18n service: 把 excel 转成源文件
i18n service->>i18n hub: 入库
到这里就大概实现多语言管理与项目构建的流程优化了,对于测试回归仍然需要人工介入,优化方向就是自动化测试了,这里暂不延申。