升鲜宝静态文本国际化完整 SQL 说明
升鲜宝静态文本国际化完整 SQL 说明
方案定案
升鲜宝静态文本国际化采用“资源包表 + 资源定义表 + 翻译明细表 + 发布表”的四表架构,按平台、模块、页面组织静态文本资源;运行时统一通过页面资源包加载与缓存分发,不再使用旧式单表 key-value 实时查询模型。
一、四张表的职责
1. sys_i18n_bundle
资源包表。
一个页面或一个场景对应一个 bundle,例如:
admin.crm.customer_formcustomer.oms.order_submitpda.wms.stockin_scan
2. sys_i18n_resource
资源定义表。
定义一个 bundle 里有哪些静态文本项,例如:
admin.crm.customer_form.label.customer_nameadmin.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_nameadmin.crm.customer_form.placeholder.phonecustomer.oms.order_submit.button.submitpda.wms.stockin_scan.placeholder.barcode
三、运行时读取方式
运行时不要逐条查单个 key,统一按 bundle 读取。
页面初始化时
按:
platformCodemoduleCodepageCodelanguageCode
一次性加载该页面的全部静态文本。
缓存 Key 建议
Redis:
i18n:bundle:{bundleCode}:{languageCode}:v{publishVersion}
例如:
i18n:bundle:admin.crm.customer_form:zh_CN:v12i18n: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 里循环查:
- 当前语言翻译
- 默认语言翻译
default_textresource_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;
`

浙公网安备 33010602011771号