






















升鲜宝高性能多语言解决方案(二)---升鲜宝生鲜配送供应链管理系统
sys_m_languagesys_static_translationsys_dynamic_translationpms_goods_i18nsys_user / sys_role / sys_menu / sys_role_menu / sys_role_usersys_i18n_ui_resource + sys_i18n_ui_resource_itemsys_message_template + sys_message_template_i18n*_i18npms_goods + pms_goods_i18ni18n:ui:ver:{platform}:{lang}:{module}:{page} => 版本号i18n:ui:data:{platform}:{lang}:{module}:{page}:v{ver} => Hash/JSONi18n:ui:ver:web:zh_CN:crm:customer_listi18n:ui:data:web:zh_CN:crm:customer_list:v12i18n:msg:ver:{lang} => 版本号i18n:msg:data:{lang}:v{ver} => Hash(messageCode -> template)i18n:msg:ver:zh_CNi18n:msg:data:zh_CN:v7rbac:menu:ver:{roleId}:{platform}:{lang} => 版本号rbac:menu:data:{roleId}:{platform}:{lang}:v{ver} => JSON treerbac:menu:ver:1001:web:zh_CNrbac:menu:data:1001:web:zh_CN:v19i18n:dict:ver:{dictType}:{lang} => 版本号i18n:dict:data:{dictType}:{lang}:v{ver} => List/Hashi18n:dict:ver:order_status:en_USi18n:dict:data:order_status:en_US:v5goods:detail:{goodsId}:{lang} => JSONgoods:list:{scene}:{lang}:{pageNo}:{pageSize}:{hashFilter} => JSONsys_i18n_cache_version ┌──────────────────────────┐
│ 前端 / App / 管理后台 │
└────────────┬─────────────┘
│ languageCode
▼
┌──────────────────────────┐
│ LocaleContextFilter │
│ 1. header/query/user设置 │
│ 2. 放入 ThreadLocal │
└────────────┬─────────────┘
│
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌────────────────────┐
│ UiI18nService │ │ MessageI18nSvc │ │ BizI18nQuerySvc │
│ 页面整包文案 │ │ 消息模板解析 │ │ 业务主数据翻译 │
└───────┬─────────┘ └─────────┬────────┘ └──────────┬─────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌────────────────────┐
│ Caffeine L1 │ │ JVM Map L1 │ │ Caffeine L1 │
│ key=page bundle │ │ key=lang+msgCode │ │ key=goods/menu/etc │
└───────┬─────────┘ └─────────┬────────┘ └──────────┬─────────┘
│ miss │ miss/refresh │ miss
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌────────────────────┐
│ Redis L2 │ │ Redis Version │ │ Redis L2 / Snapshot│
│ Hash/JSON │ │ / PubSub │ │ JSON / read model │
└───────┬─────────┘ └─────────┬────────┘ └──────────┬─────────┘
│ miss │ reload trigger │ miss
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ MySQL │
│ sys_i18n_ui_resource(_item) / sys_message_template(_i18n) │
│ sys_menu_i18n / sys_dict_*_i18n / sys_notice_i18n / *_i18n │
└─────────────────────────────────────────────────────────────────┘
topic:i18n:msg:refreshgoods_lang_snapshotsys_dynamic_translation 不进热路径SELECT
g.id,
COALESCE(gi.goods_name, g.goods_name) AS goods_name
FROM pms_goods g
LEFT JOIN pms_goods_i18n gi
ON gi.goods_id = g.id
AND gi.language = #{lang}
WHERE g.del_flag = 0;
7.2 菜单树
先查角色拥有菜单 ID
再查 sys_menu
再查 sys_menu_i18n
组装树后缓存整棵树
8. 回退规则
当前语言
系统默认语言
主表默认值
code/key 本身
9. 不建议的做法
不建议每个标签运行时逐条查库
不建议把所有翻译都塞进 sys_dynamic_translation
不建议修改后 Redis 模糊删除全量 key
不建议菜单翻译、字典翻译、消息翻译共用一张万能表
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。