Skip to main content

国际化

前言

什么是国际化

国际化这个英文单词为:Internationalization,又称 i18n,“i”为单词的第一个字母,“18”为“i”和“n”之间单词的个数,而“n”代表这个单词的最后一个字母。在计算机领域,国际化是指设计能够适应各种区域和语言环境的软件的过程。

为什么要国际化

每个团队都希望自己的产品能够让来自全世界的用户都能使用,那么,就必须让自己的产品走上国际化的路线。如何能让世界各地的用户都能较为顺利使用我们的产品?首要解决的最大问题,就是语言的显示。为用户提供多种语言,让用户能够减少障碍去解到自己的产品。这是国际化的第一步,也是最重要的一步。

实施对象

国际化实施的对象为:组件,页面,导航,面包屑,货币,时间。 其中组件由组件库(Ant-Design)提供国际化支持,其余由前端框架(Angular/Vue/React)提供国际化支持。

优秀实践

为了便于语言条目的维护,从以下三个条目整理了优秀实践。

  • 目录结构
  • 语言包划分
  • 语言条目的组织

目录结构

一个层次分明的目录结构,能让我们快速定位到需要查找的语言条目。

src
│─ i18n
│ ├─ en_GB // 英文 语言包
│ ├─ ja_JP // 日文 语言包
│ ├─ zh_CN // 中文 语言包
│ │ ├─ index.ts // 中文语言包 配置文件
│ │ ├─ common.json // 共通部分语言文件,用于存放全局共通的语言条目
│ │ ├─ modules // 业务模块语言包目录,用于存放各个业务模块语言文件
│ │ └─ user.json // 用户管理模块语言文件
│ │ └─ statistic.json // 统计模块语言文件
│ │ └─ <业务模块名>.json // 其他业务模块 语言文件
  • common.json: 用于存放全局共通的语言条目
  • modules: 业务模块语言包目录,用于存放各个业务模块语言文件
  • <业务模块名>.json: 用于存放业务模块中的语言条目

语言包划分

方案灵活性维护成本
方案一:每个页面单独一个语言文件
方案二:每个业务模块一个语言文件 + 共通语言文件
方案三:整个应用一个语言文件

基于灵活性与维护成本的综合考量,我们选择方案二。

语言条目的组织

语言条目的组织分为两个部分,common 部分和模块部分。

common.json

用于存放全局共通的语言条目,我们总结了一些经常会使用到的操作、提示、分页参数以供参考。

类别常用条目(key)常用条目(value)
操作(actions)new新建
add添加
delete删除
edit编辑
search查询
refresh刷新
detail详情
confirm确认
cancel取消
save保存
submit提交
export导出
import导入
next下一步
previous上一步
提示信息(messages)success操作成功
failed操作失败
其他(others)pagination0 条,每页显示 1

具体结构如下8

{
// 操作
"actions": {
"new": "新建",
"add": "添加"
},
// 提示信息
"messages": {
"success": "操作成功",
"delete": "删除成功"
},
// 其他
"others": {
"pagination": "共 { 0 } 条,每页显示 { 1 } 条"
}
}

<业务模块名>.json

在<业务模块名>.json中,分为两部分:common 部分和页面部分。

common部分

用于存储业务模块内的共通部分,我们从项目中总结了一些常用的类别:

  • columns // 列表项
  • labels // 表单项
  • extra // 表单提示
  • status // 状态
  • actions // 操作

页面部分

在实际项目中,一个模块下往往会有多个页面,我们的优秀实践是按照页面划分,其中共通的部分采用在语言文件内引用。

比较项目页面上直接使用在语言文件内引用
便利性
维护性

基于使用上的便利性和后期的可维护性,我们选择了共通的部分在语言文件内引用的方式。

语言条目命名规范

  • 列表项(columns)的命名,应与columns-options.ts中的key相同。
  • 其他条目命名方法需要:见名知意、驼峰命名法、精简表达,以订单号为例:orderNo。

具体结构如下

{
// common部分
"common": {
// 列表项
"columns": {
"time": "操作时间",
"orderNo": "订单编号",
"...": "..."
},
// 表单项
"labels": {},
// 状态
"status": {},
// 提示
"extra": {},
// 操作
"action": {}
},
// 页面部分
"list": { // 列表页
"columns": {
"time": "@:modules.demo.common.columns.time",
"orderNo": "@:modules.demo.common.columns.orderNo",
"...": "..."
}
},
"detail": {}, // 详情页
"add": {}, // 添加页
"edit": {} // 编辑页
}

安装与配置