Hello World

吞风吻雨葬落日 欺山赶海踏雪径

0%

多语言平台架构设计

多语言平台架构设计

设计

国际化(Internationalization,简称i18n),目的是为了更好的提供本地化的服务。

概念

  • 参考语言 Reference,其他语种依据参考语言做翻译
  • 模糊翻译的概念 Fuzzy Translation,参考语言有变动后,其他语言翻译设标志位

输出

  • app 文件(Android/ios的 xml)
  • web 文件(json5)
  • nacos (json)
  • api (支持CI/CD拉取)
  • dubbo (模板的渲染)

类型

  • 静态 (android/iso/h5/服务端等)
  • 动态 (服务端)

模型

  • 应用 app(神眸/ cinmoor/ sensforge / open-platform)
  • 模块 module(可选, app/web 端使用:云相册模块、直播模块 )
  • 标识 key 应用下的唯一标识,业务自定义,可以理解为标识code
  • 参考语言 reference 多语言的参考语言、本位语言,翻译是基于此语言做其他新增语言翻译。应用维度
  • 语种标识 [_language_code_]-[_country_code_]

image.png

流程

  1. 管理员新建应用(app),确定参考语言(reference)
  2. 管理员做初始化,导入 key 和对应的 参考语言(支持增量,参考语言覆盖需要确认)
  3. 新建多语言版本(继承上个发布版本),新增语种(可选)。
  4. 翻译内容输入
    1. 直接页面编辑
    2. 导出模板之后翻译再导入
    3. 大模型翻译
  5. 翻译内容输出
    1. 导出xml/json/excel文件
    2. 导出到nacos中
    3. Api接口输出
    4. dubbo接口按key 模板渲染输出

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sequenceDiagram
actor p as 客户
participant a as saas
participant d as 二方
participant n as nacos

p->>a: 新建app、设置参考语言
p->>a: 上传初始化(key+参考语言)
p->>a: 新建版本
p->>a: 新建语种
p->>p: 执行翻译
p->>a: 上传、编辑翻译
p->>a: 发布
a->>p: 导出文本
p->>d: 导入文件
a->>n: 刷新配置
d->>a: 拉取翻译

版本状态
限制:只能导出最新发布版本。
image.png

数据结构

应用

tb_i18n_app

字段 名称 备注
id 主键
app_code
biz_type 业务类型
reference 参考语言 en
remark
manager 管理员 []
lang 语言种类 语言种类 [“zh-CN”,”en-US”]
module 模块列表 []
version_count 保留版本数 默认是 2
publish_version 发布版本
latest_version 最新版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `tb_i18n_app` (
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
`app_code` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '应用标识',
`biz_type` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '业务类型',
`reference` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '参考语种',
`remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`manager` json NOT NULL COMMENT '管理员',
`lang` json DEFAULT NULL COMMENT '语种',
`module` json DEFAULT NULL COMMENT '模块',
`version_count` int(10) unsigned DEFAULT NULL COMMENT '保留版本',
`publish_version` bigint(20) unsigned DEFAULT NULL COMMENT '发布版本',
`latest_version` bigint(20) unsigned DEFAULT NULL COMMENT '最新版本',
PRIMARY KEY (`id`),
UNIQUE KEY `tb_i18n_app_unique` (`app_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

翻译

key

字段 名称 备注
app_id
module
key 大小写敏感
type text/json
remark 说明
message 错误提示信息
version_id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE `tb_i18n_key` (
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
`app_id` bigint(20) unsigned NOT NULL COMMENT '应用ID',
`module` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '模块',
`key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'key',
`type` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '类型',
`remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`message` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`version_id` bigint(20) unsigned NOT NULL COMMENT '版本ID',
PRIMARY KEY (`id`),
UNIQUE KEY `tb_i18n_key_uniq` (`app_id`,`version_id`,`key`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

content

字段 名称 备注
key_id
lang_code 语言 cn/en
content
fuzzy 1. 0
version
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `tb_i18n_content` (
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
`key_id` bigint(20) unsigned NOT NULL COMMENT 'keyid',
`lang` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '语种',
`content` text COLLATE utf8mb4_unicode_ci,
`fuzzy` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tb_i18n_content_key_uniq` (`key_id`,`lang`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

版本

字段 名称 备注
app_id
version
name
remark
status 0-开发中 1-已发布 2-提测
published_by
published_at
archived 归档 直接静态化存储到oss
archived_key 归档key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE `tb_i18n_version` (
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
`app_id` bigint(20) unsigned NOT NULL COMMENT 'appid',
`version` bigint(20) unsigned NOT NULL COMMENT '版本',
`remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`status` int(10) unsigned DEFAULT NULL COMMENT '状态 0-开发中 1-已发布 2-提测',
`published_by` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`published_at` datetime DEFAULT NULL,
`archived` tinyint(3) unsigned DEFAULT NULL COMMENT '是否归档 1-已归档',
`archived_key` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '归档Key',
PRIMARY KEY (`id`),
UNIQUE KEY `tb_i18n_version_app_id_IDX` (`app_id`,`version`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

发布校验

版本发布前需要做完整的校验逻辑

节奏

  1. 框架与静态资源支持
  2. 大模型翻译支持
  3. 动态实时模板渲染支持

参考

当前成熟商业化产品

https://lokalise.com/

https://poeditor.com/

https://weblate.org/zh-hans/

Language Codes
https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes

Country Codes
https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes