核心是四步:预加载语言包→按规则存取→版本控制防旧包→出错自动兜底;缓存key须含版本号如i18n_${locale}_${version},读写需JSON序列化+try/catch,初始化优先查缓存并设fallback链,切换语言需同步更新lang属性及data-i18n元素。

网页端用 localStorage 缓存国际化文案,核心不是“存进去就行”,而是让缓存真正可用、安全、不拖慢页面、出错也不崩。关键在四步:预加载语言包 → 按规则存取 → 版本控制防旧包 → 出错自动兜底。
语言包缓存要带版本号
别用固定 key 如 i18n_zh-CN,否则更新文案后用户永远看不到新内容。推荐格式:i18n_${locale}_${version}。version 可来自构建时生成的哈希值(比如 md5(JSON.stringify(zhData))),或服务端返回的 ETag。这样每次构建或发布语言包,key 就变,旧缓存自然失效,无需手动清理。
读写必须加 JSON 序列化和异常捕获
localStorage 只存字符串,直接存对象会变成 [object Object],取出来完全没法用。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 存的时候:用 JSON.stringify(pkg) 转成字符串再 setItem
- 取的时候:先 getItem,再用 JSON.parse() 解析,且必须包在 try/catch 里
- 解析失败(比如缓存损坏、JSON 格式错)要立即 remove 该 key,并触发重新请求,避免整个 i18n 系统卡死
初始化时优先查缓存,但要有完整 fallback 链
页面一打开就要决定用哪种语言,不能等用户点按钮才开始加载。
- 第一步:读 localStorage.getItem('preferred-lang'),拿到用户上次选的语言(如 'zh')
- 第二步:用这个语言 + 对应 version 去查缓存 key,命中则直接渲染
- 未命中就 fetch 加载语言包,成功后存入 localStorage 并应用;失败则降级到内存缓存(如 window.__i18n_fallback)或最小 fallback 文案表(比如 { confirm: 'OK', cancel: 'Cancel' }),保证按钮文字不为空
切换语言时不能只改 localStorage
存对了只是开始,后续三件事必须同步做:
- 更新 document.documentElement.lang(注意用 BCP 47 格式,如 zh-Hans,不是 zh_CN)
- 遍历所有带 data-i18n 的元素,替换 textContent;还要处理 data-i18n-placeholder、data-i18n-title 等动态属性
- 对已存在的子元素 lang 属性(如 )保留原值,防止被全局 lang 覆盖
不复杂但容易忽略:缓存本身不会让页面变多语言,它只是加速加载的工具。真正起效的是你是否在正确时机读、是否结构化地更新 DOM、是否在各种边界情况(无痕模式、网络失败、JSON 损坏)下都稳得住。

















