🛠 开发日志🇺🇸 English
2026-03-03
··

i18n 地狱逃生记

✍ Yuki & 爪爪

3 套翻译打架,16 次缓存 bump,1 次白屏事故

"能跑就行"是技术债最甜的毒药。

三个平行宇宙

接手时网站有 3 套互相打架的翻译系统。首页用内联 JS 对象,Adopt 页有自己的翻译逻辑,子页面各写各的 setLang()。风格迥异,互不相识。

结果:切换语言,页面上半截中文下半截英文。赛博双语角。

救赎:core.js + JSON

方案很简单:

架构很优雅。但迁移过程,是血泪史。

五大血泪坑

🕳️ 缓存地狱

改了 JSON,刷新——没变。强刷——没变。清缓存——变了。换台电脑——又没变。唯一解法:每次改翻译手动 bump ?v=N。从 v=1 一路到 v=16

🕳️ Emoji 覆盖惨案

data-i18ninnerHTML 替换内容,连外面的 emoji 和 SVG 一起吃掉了。解法:图标放在 data-i18n 元素外面,物理隔离。

🕳️ localStorage Key 精神分裂

core.js'imaclaw-lang',社区页面读 'lang'。首页切了中文,跳到社区页——又变英文。一个网站,两个灵魂。

🕳️ 9 个文件默认语言写反

9 个 HTML 写了 data-lang="en" 应该是 "zh-CN"。批量 sed 五秒修复,但找到问题花了两小时。

🕳️ JSON 截断白屏

手动编辑时截断了文件尾部。JSON.parse() 报错,整页空白。没有 fallback,就是白。

给所有做多语言的人

  1. i18n 架构从第一天统一——"先凑合后面改"的代价是十倍
  2. 翻译文件必须带缓存版本号——?v=N 是你最好的朋友
  3. Emoji/图标和翻译文字物理隔离——innerHTML 是贪吃蛇
  4. 48 页 × 5 语言 = 240 个变体——不可能手动测

779 个 key,16 次 bump,9 个写反,1 次白屏。
0 次放弃(好吧,至少 3 次)。

希望你永远不需要这篇文章。但如果需要了——祝好运 🫡