- 前期规划
- 注意项
- 流程的制定
- 集成与自动化
# 前期规划
在制定多语言方案前,首先需要确定需要支持的语言和地区,并对具体要翻译语言的工作量进行估计。然后需要选择合适的技术框架和多语言插件。
由于我们的项目是 Vue 框架,我们选择了 vue-i18n-next
作为多语言插件,并使用 JSON
文件格式来存储翻译内容。如果需要使用其他格式如 YAML
或自动导入功能,可以考虑使用 @intlify/unplugin-vue-i18n
插件。
在确定了技术选型后,我们需要制定一个友好的多语言文件结构。常见的方法是在多语言目录下创建内容文件,并在内容文件中使用 KEY 来实现多语言。
第一种:
├─locales
│ ├─en
│ │ index.js
│ │ home.js
| ├─zh-CN
│ │ index.js
│ │ home.js
| ├─jp
│ │ index.js
│ │ home.js
第二种:
├─locales
| ├─index.js
| ├─home.js
// index.js
{
"en": {},
"zh-CN": {},
"jp": {}
}
在确定多语言方案时,我们也需要规避命名冲突问题,并确定如何使用 namespace 来隔离本地化的 Key。因为存在以下问题:
- 同一个词可能有多种含义。
- 不同的文件可能会出现同名的 Key。
- 某些内容很难命名,难以明确建立 Key。
我们的解决方案是使用文件划分来隔离命名空间,通过增加命名关系来解决冲突。对于命名困难的 Key,我们使用 hash 后的内容作为 Key。此外,我们使用扁平化的 JSON 结构来避免嵌套带来的维护成本和复杂度。
{
"home.banner.text": "这样命名来减少嵌套",
"home:banner:text": "也可以使用其他分隔符"
}
# 注意项
确定源语言,源语言作为其他语言的范本。翻译时,对语言文件中所有的 key,按照源语言的内容进行翻译,一般来说会以英文为主,因为英文做 key 更符合命名习惯。
有些内容可能会有特殊的语法,比如英文会有复数形式,vue-i18n-next
支持复数语法,使用 dog | dogs
来定义内容。
有些插值的情况,最好明确插值意义,比如 "{0} is requried",不如 "{fields} is required" 更容易理解和维护。
文本内如果需要使用 i18n 内的转移字符,可以使用在符号外加上引号和括号 ({'!@#$%^&*'})
# 流程制定
在多语言写作的工作流程中,涉及到产品、设计、开发和翻译人员等多个角色,因此需要一个统一的平台来管理 Key 和内容,以便协作和管理。在这个流程中,产品需求交给设计,设计考虑不同文本长度对设计样式的影响,然后交给前端设置对应 Key,再将需要翻译的其他语言文件交给翻译人员。翻译完成后,前端进行代码的部署上线。
然而,如果中间涉及多个人,时间和复杂程度都会增加。因此,我们需要一个在线的多语言内容管理平台来统一管理 Key 和内容,以便所有人在这个平台上进行协作和管理。
如果内容较少,翻译人员可以接受 JSON 等文件形式。也可以使用 git 进行管理,但需要一定的时间成本和技术门槛。在线表格工具也可以用来管理内容,但缺乏版本控制和协同功能。
目前已经有很多线上的成熟产品可以使用,我们选择了 localazy
(也是 vue-i18n-next 的赞助商)。localazy
支持多人协作、版本管理、评论、翻译审查和自动翻译等功能,同时支持代码接入和 CI 集成,非常符合我们的需求。
# 集成与自动化
为了增加 Key,我们将在前端增加相应的代码,并将 localazy
的提交流程纳入其中。这样,新增的源语言 Key 文件将被推送到平台上,然后通知翻译人员进行文本更新。一旦翻译人员完成更新,我们将在 CI 流程中增加一个 localazy
拉取的阶段,可以手动或自动触发,以完成多语言文件的更新。