升鲜宝静态文本国际化完整 SQL 说明

升鲜宝静态文本国际化完整 SQL 说明

方案定案

升鲜宝静态文本国际化采用“资源包表 + 资源定义表 + 翻译明细表 + 发布表”的四表架构,按平台、模块、页面组织静态文本资源;运行时统一通过页面资源包加载与缓存分发,不再使用旧式单表 key-value 实时查询模型。


一、四张表的职责

1. sys_i18n_bundle

资源包表。
一个页面或一个场景对应一个 bundle,例如:

  • admin.crm.customer_form
  • customer.oms.order_submit
  • pda.wms.stockin_scan

2. sys_i18n_resource

资源定义表。
定义一个 bundle 里有哪些静态文本项,例如:

  • admin.crm.customer_form.label.customer_name
  • admin.crm.customer_form.placeholder.phone

3. sys_i18n_resource_text

翻译明细表。
保存某个资源在某种语言下的显示文本,例如:

  • resource_id=xxx + language_code=en_US -> Customer Name

4. sys_i18n_bundle_publish

发布表。
用于记录某个 bundle 在某个语言下的发布版本,方便 Redis / Caffeine 缓存版本失效。


二、推荐资源编码规范

统一建议:

{platform}.{module}.{page}.{componentType}.{componentName}

示例:

  • admin.crm.customer_form.label.customer_name
  • admin.crm.customer_form.placeholder.phone
  • customer.oms.order_submit.button.submit
  • pda.wms.stockin_scan.placeholder.barcode

三、运行时读取方式

运行时不要逐条查单个 key,统一按 bundle 读取。

页面初始化时

按:

  • platformCode
  • moduleCode
  • pageCode
  • languageCode

一次性加载该页面的全部静态文本。

缓存 Key 建议

Redis:

i18n:bundle:{bundleCode}:{languageCode}:v{publishVersion}

例如:

  • i18n:bundle:admin.crm.customer_form:zh_CN:v12
  • i18n:bundle:pda.wms.stockin_scan:en_US:v7

值建议直接缓存为 JSON Map:

{
  "admin.crm.customer_form.label.customer_name": "客户名称",
  "admin.crm.customer_form.placeholder.phone": "请输入手机号",
  "admin.crm.customer_form.button.save": "保存"
}

四、回退规则

统一建议放在服务层做,不在 SQL 里循环查:

  1. 当前语言翻译
  2. 默认语言翻译
  3. default_text
  4. resource_code

五、适用范围

本方案只适用于:

  • 页面标题
  • 表单标签
  • 列头
  • placeholder
  • tooltip
  • tab 标题
  • dialog 标题
  • 空状态文案
  • 固定说明文案
  • 非权限型普通按钮文案

不用于:

  • 菜单 / RBAC 按钮名称
  • 消息模板
  • 业务主数据
  • 动态业务字段翻译

六、SQL 文件内容

附带的 SQL 已经包含:

  • 四张表完整 DDL
  • 外键与索引
  • 一组示例 bundle / resource / text / publish 初始化数据
  • 常用查询 SQL 注释示例

可直接作为研发初版落库脚本。

`-- =========================================================
-- 升鲜宝静态文本国际化完整 SQL
-- 方案:资源包表 + 资源定义表 + 翻译明细表 + 发布表
-- 说明:
-- 1. 本方案只服务“静态文本”国际化
-- 2. 不包含菜单/RBAC 按钮名称、消息模板、业务主数据翻译
-- 3. 运行时按页面资源包(bundle)加载,不再按单个 key-value 实时查询
-- 4. 字符集统一 utf8mb4 / utf8mb4_general_ci
-- =========================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- =========================================================
-- 1. 资源包表
-- =========================================================
DROP TABLE IF EXISTS sys_i18n_bundle;

CREATE TABLE sys_i18n_bundle (
id bigint NOT NULL COMMENT '主键id',
bundle_code varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '资源包编码,唯一',
bundle_name varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源包名称',
platform_code varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '端:admin/customer/purchase/supplier/picking/delivery/pda',
module_code varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '模块编码,如crm/wms/oms',
page_code varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '页面编码,如customer_form/order_submit',
scene_type varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'page' COMMENT '场景类型:page/dialog/component',
default_language_code varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'zh_CN' COMMENT '默认语言',
version_no bigint NOT NULL DEFAULT '1' COMMENT '当前版本号',
enabled int NOT NULL DEFAULT '1' COMMENT '状态 0禁用 1正常',
del_flag int NOT NULL DEFAULT '0' COMMENT '删除标记 0正常 1删除',
sort_code int NOT NULL DEFAULT '1' COMMENT '排序码',
create_date bigint DEFAULT NULL COMMENT '创建时间',
creator bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
update_date bigint DEFAULT NULL COMMENT '修改时间',
updater bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
remark varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id) USING BTREE,
UNIQUE KEY uk_bundle_code (bundle_code) USING BTREE,
KEY idx_platform_module_page (platform_code,module_code,page_code) USING BTREE,
KEY idx_scene_type (scene_type) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='静态文本资源包表';

-- =========================================================
-- 2. 资源定义表
-- =========================================================
DROP TABLE IF EXISTS sys_i18n_resource;

CREATE TABLE sys_i18n_resource (
id bigint NOT NULL COMMENT '主键id',
bundle_id bigint NOT NULL COMMENT '资源包id=sys_i18n_bundle.id',
resource_code varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '资源编码,全局唯一',
resource_name varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源名称',
component_type varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件类型:label/column/placeholder/tab/dialog/button/tooltip/empty',
component_name varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件名/字段名',
default_text varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '默认文本',
max_length int DEFAULT '200' COMMENT '最大建议长度',
sort_code int NOT NULL DEFAULT '1' COMMENT '排序码',
enabled int NOT NULL DEFAULT '1' COMMENT '状态 0禁用 1正常',
del_flag int NOT NULL DEFAULT '0' COMMENT '删除标记 0正常 1删除',
create_date bigint DEFAULT NULL COMMENT '创建时间',
creator bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
update_date bigint DEFAULT NULL COMMENT '修改时间',
updater bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
remark varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id) USING BTREE,
UNIQUE KEY uk_resource_code (resource_code) USING BTREE,
KEY idx_bundle_id (bundle_id) USING BTREE,
KEY idx_component (component_type,component_name) USING BTREE,
CONSTRAINT fk_sys_i18n_resource_bundle FOREIGN KEY (bundle_id) REFERENCES sys_i18n_bundle (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='静态文本资源定义表';

-- =========================================================
-- 3. 翻译明细表
-- =========================================================
DROP TABLE IF EXISTS sys_i18n_resource_text;

CREATE TABLE sys_i18n_resource_text (
id bigint NOT NULL COMMENT '主键id',
resource_id bigint NOT NULL COMMENT '资源id=sys_i18n_resource.id',
language_code varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '语言编码,如zh_CN/en_US/ja_JP',
text_value varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '翻译文本',
version_no bigint NOT NULL DEFAULT '1' COMMENT '资源文本版本号',
enabled int NOT NULL DEFAULT '1' COMMENT '状态 0禁用 1正常',
del_flag int NOT NULL DEFAULT '0' COMMENT '删除标记 0正常 1删除',
create_date bigint DEFAULT NULL COMMENT '创建时间',
creator bigint NOT NULL DEFAULT '0' COMMENT '创建人id',
update_date bigint DEFAULT NULL COMMENT '修改时间',
updater bigint NOT NULL DEFAULT '0' COMMENT '修改人id',
remark varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
PRIMARY KEY (id) USING BTREE,
UNIQUE KEY uk_resource_lang (resource_id,language_code) USING BTREE,
KEY idx_lang_resource (language_code,resource_id) USING BTREE,
CONSTRAINT fk_sys_i18n_resource_text_resource FOREIGN KEY (resource_id) REFERENCES sys_i18n_resource (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='静态文本翻译明细表';

-- =========================================================
-- 4. 发布表
-- =========================================================
DROP TABLE IF EXISTS sys_i18n_bundle_publish;

CREATE TABLE sys_i18n_bundle_publish (
id bigint NOT NULL COMMENT '主键id',
bundle_id bigint NOT NULL COMMENT '资源包id=sys_i18n_bundle.id',
language_code varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '语言编码',
publish_version bigint NOT NULL DEFAULT '1' COMMENT '发布版本号',
publish_time bigint DEFAULT NULL COMMENT '发布时间',
publish_user_id bigint NOT NULL DEFAULT '0' COMMENT '发布人',
enabled int NOT NULL DEFAULT '1' COMMENT '状态 0禁用 1正常',
del_flag int NOT NULL DEFAULT '0' COMMENT '删除标记 0正常 1删除',
PRIMARY KEY (id) USING BTREE,
UNIQUE KEY uk_bundle_lang_publish (bundle_id,language_code) USING BTREE,
KEY idx_bundle_lang (bundle_id,language_code) USING BTREE,
CONSTRAINT fk_sys_i18n_bundle_publish_bundle FOREIGN KEY (bundle_id) REFERENCES sys_i18n_bundle (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='静态文本资源包发布表';

-- =========================================================
-- 5. 初始化示例数据
-- =========================================================

-- 资源包:后台 CRM 客户表单
INSERT INTO sys_i18n_bundle
(id,bundle_code,bundle_name,platform_code,module_code,page_code,scene_type,default_language_code,version_no,enabled,del_flag,sort_code,create_date,creator,update_date,updater,remark)
VALUES
(100000000000000001,'admin.crm.customer_form','后台-CRM-客户表单','admin','crm','customer_form','page','zh_CN',1,1,0,1,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'后台CRM客户表单静态文本资源包');

-- 资源定义
INSERT INTO sys_i18n_resource
(id,bundle_id,resource_code,resource_name,component_type,component_name,default_text,max_length,sort_code,enabled,del_flag,create_date,creator,update_date,updater,remark)
VALUES
(100000000000100001,100000000000000001,'admin.crm.customer_form.label.customer_name','客户名称标签','label','customer_name','客户名称',50,1,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'客户名称标签'),
(100000000000100002,100000000000000001,'admin.crm.customer_form.placeholder.phone','手机号占位符','placeholder','phone','请输入手机号',50,2,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'手机号占位符'),
(100000000000100003,100000000000000001,'admin.crm.customer_form.button.save','保存按钮','button','save','保存',20,3,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'保存按钮');

-- 中文翻译
INSERT INTO sys_i18n_resource_text
(id,resource_id,language_code,text_value,version_no,enabled,del_flag,create_date,creator,update_date,updater,remark)
VALUES
(100000000000200001,100000000000100001,'zh_CN','客户名称',1,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'中文'),
(100000000000200002,100000000000100002,'zh_CN','请输入手机号',1,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'中文'),
(100000000000200003,100000000000100003,'zh_CN','保存',1,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'中文');

-- 英文翻译
INSERT INTO sys_i18n_resource_text
(id,resource_id,language_code,text_value,version_no,enabled,del_flag,create_date,creator,update_date,updater,remark)
VALUES
(100000000000200004,100000000000100001,'en_US','Customer Name',1,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'英文'),
(100000000000200005,100000000000100002,'en_US','Please enter phone number',1,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'英文'),
(100000000000200006,100000000000100003,'en_US','Save',1,1,0,UNIX_TIMESTAMP()1000,0,UNIX_TIMESTAMP()1000,0,'英文');

-- 发布记录
INSERT INTO sys_i18n_bundle_publish
(id,bundle_id,language_code,publish_version,publish_time,publish_user_id,enabled,del_flag)
VALUES
(100000000000300001,100000000000000001,'zh_CN',1,UNIX_TIMESTAMP()1000,0,1,0),
(100000000000300002,100000000000000001,'en_US',1,UNIX_TIMESTAMP()
1000,0,1,0);

-- =========================================================
-- 6. 常用查询 SQL
-- =========================================================

-- 6.1 按页面加载静态文本资源包
-- 入参:platformCode / moduleCode / pageCode / languageCode
/*
SELECT
b.bundle_code,
b.version_no,
r.resource_code,
COALESCE(t.text_value, r.default_text) AS text_value
FROM sys_i18n_bundle b
INNER JOIN sys_i18n_resource r
ON r.bundle_id = b.id
AND r.del_flag = 0
AND r.enabled = 1
LEFT JOIN sys_i18n_resource_text t
ON t.resource_id = r.id
AND t.language_code = #{languageCode}
AND t.del_flag = 0
AND t.enabled = 1
WHERE b.platform_code = #{platformCode}
AND b.module_code = #{moduleCode}
AND b.page_code = #{pageCode}
AND b.del_flag = 0
AND b.enabled = 1
ORDER BY r.sort_code ASC, r.id ASC;
*/

-- 6.2 按 bundle_code 加载资源包
/*
SELECT
r.resource_code,
COALESCE(t.text_value, r.default_text) AS text_value
FROM sys_i18n_bundle b
INNER JOIN sys_i18n_resource r
ON r.bundle_id = b.id
AND r.del_flag = 0
AND r.enabled = 1
LEFT JOIN sys_i18n_resource_text t
ON t.resource_id = r.id
AND t.language_code = #{languageCode}
AND t.del_flag = 0
AND t.enabled = 1
WHERE b.bundle_code = #{bundleCode}
AND b.del_flag = 0
AND b.enabled = 1
ORDER BY r.sort_code ASC, r.id ASC;
*/

-- 6.3 资源维护页:查看 bundle 下全部资源及各语言
/*
SELECT
b.bundle_code,
r.resource_code,
r.resource_name,
r.component_type,
r.component_name,
r.default_text,
t.language_code,
t.text_value
FROM sys_i18n_bundle b
INNER JOIN sys_i18n_resource r
ON r.bundle_id = b.id
AND r.del_flag = 0
LEFT JOIN sys_i18n_resource_text t
ON t.resource_id = r.id
AND t.del_flag = 0
WHERE b.bundle_code = #{bundleCode}
AND b.del_flag = 0
ORDER BY r.sort_code ASC, r.id ASC, t.language_code ASC;
*/

-- 6.4 缺失翻译检查:找默认语言已存在、目标语言不存在的资源
/*
SELECT
b.bundle_code,
r.resource_code,
r.default_text
FROM sys_i18n_bundle b
INNER JOIN sys_i18n_resource r
ON r.bundle_id = b.id
AND r.del_flag = 0
LEFT JOIN sys_i18n_resource_text target
ON target.resource_id = r.id
AND target.language_code = #{targetLanguageCode}
AND target.del_flag = 0
AND target.enabled = 1
WHERE b.del_flag = 0
AND b.enabled = 1
AND r.enabled = 1
AND target.id IS NULL
ORDER BY b.bundle_code ASC, r.sort_code ASC, r.id ASC;
*/

SET FOREIGN_KEY_CHECKS = 1;
`

posted @ 2026-04-19 16:18  升鲜宝生鲜供应链系统  阅读(9)  评论(0)    收藏  举报