关键在于结构可读、可维护、可扩展:采用模块化一级分组(如auth、dashboard)、语义化二级键名,混合扁平与浅层嵌套;文件名遵循BCP 47标准(如zh-CN.json),UTF-8无BOM;JSON仅存纯文本和{key}占位符,渲染、复数、格式化等逻辑交由JS层处理。

用 JSON 管理前端多语言配置,关键不是“堆数据”,而是让结构可读、可维护、可扩展。核心是把语言文本从代码里彻底剥离,靠统一键名驱动替换,同时兼顾嵌套、复用和加载效率。
语言包结构要扁平+嵌套结合
纯扁平(如 {"login_btn": "登录", "logout_btn": "退出"})初期简单,但项目一复杂就难管理;全嵌套(如 {"user": {"login": "登录", "logout": "退出"}})语义清晰,但深层访问易出错。推荐混合方式:
- 一级用功能模块分组(
auth、dashboard、error),提升可读性 - 二级用语义化 key(不写
btn1,而写submit或confirm_action) - 允许浅层嵌套处理复数或变体,例如:
"notification": { "new_msg": "{count} 条新消息", "new_msg_plural": "{count} 条新消息" } - 所有字符串值保持纯文本,不拼接 HTML 或样式类——渲染逻辑交给 JS
文件组织按 locale 命名,支持区域变体
不要用 zh.json 和 en.json 这样模糊的命名。实际中 zh-CN 和 zh-TW 差异明显,en-US 和 en-GB 的拼写、单位也不同。推荐:
- 文件名严格对应 BCP 47 标准:
zh-CN.json、en-US.json、ja-JP.json - 目录结构清晰:
/locales/zh-CN.json、/locales/en-US.json - 提供
fallback.json(或设fallbackLng: 'en-US')兜底缺失 key,避免显示空或 key 名本身 - 每个文件 UTF-8 编码保存,禁止 BOM,防止解析失败或乱码
加载与切换时保持 JSON 的纯净性
JSON 是数据载体,不是逻辑容器。它只该存翻译文本,不该掺杂函数、条件、模板语法:
立即学习“Java免费学习笔记(深入)”;
- 占位符统一用
{key}格式(如"hello_user": "你好,{name}!"),插值由 JS 层处理,JSON 本身不执行 - 避免在 JSON 里写条件分支(如
"status": "{value === 'ok' ? '正常' : '异常'}")——这属于运行时逻辑,应移至t()函数内部 - 复数形式不硬编码规则,而是预留不同 key:
"item_count_one": "1 个项目"、"item_count_other": "{count} 个项目",由调用方根据语言规则选择 - 日期/数字格式不写进 JSON,交由
Intl.DateTimeFormat等原生 API 处理
配合 JS 使用时,让 JSON 成为“活数据”而非静态快照
真正优雅,体现在 JSON 如何被程序高效、安全地消费:
- 用
data-i18n="auth.submit"标记元素,key 支持点号路径,直接映射到 JSON 嵌套结构 -
t('auth.submit', { context: 'primary' })这类带参数的调用,应在 JS 层解析,JSON 仍只存原始模板字符串 - 首次加载后缓存 parsed 对象(非原始字符串),避免重复
JSON.parse - 语言切换时,只替换 messages 引用,不重发请求——已加载的语言包保留在内存中,提升响应速度


















