"能跑就行"是技术债最甜的毒药。
三个平行宇宙
接手时网站有 3 套互相打架的翻译系统。首页用内联 JS 对象,Adopt 页有自己的翻译逻辑,子页面各写各的 setLang()。风格迥异,互不相识。
结果:切换语言,页面上半截中文下半截英文。赛博双语角。
救赎:core.js + JSON
方案很简单:
core.js(≈30 行):全站唯一翻译引擎- JSON 集中存储:
zh-CN.json、en.json,779 个 key - HTML 零硬编码:所有文字只写
data-i18n="key" - 语言检测优先级:localStorage → URL ?lang= → 浏览器语言 → 默认 zh-CN
架构很优雅。但迁移过程,是血泪史。
五大血泪坑
🕳️ 缓存地狱
改了 JSON,刷新——没变。强刷——没变。清缓存——变了。换台电脑——又没变。唯一解法:每次改翻译手动 bump ?v=N。从 v=1 一路到 v=16。
🕳️ Emoji 覆盖惨案
data-i18n 用 innerHTML 替换内容,连外面的 emoji 和 SVG 一起吃掉了。解法:图标放在 data-i18n 元素外面,物理隔离。
🕳️ localStorage Key 精神分裂
core.js 读 'imaclaw-lang',社区页面读 'lang'。首页切了中文,跳到社区页——又变英文。一个网站,两个灵魂。
🕳️ 9 个文件默认语言写反
9 个 HTML 写了 data-lang="en" 应该是 "zh-CN"。批量 sed 五秒修复,但找到问题花了两小时。
🕳️ JSON 截断白屏
手动编辑时截断了文件尾部。JSON.parse() 报错,整页空白。没有 fallback,就是白。
给所有做多语言的人
- i18n 架构从第一天统一——"先凑合后面改"的代价是十倍
- 翻译文件必须带缓存版本号——
?v=N是你最好的朋友 - Emoji/图标和翻译文字物理隔离——innerHTML 是贪吃蛇
- 48 页 × 5 语言 = 240 个变体——不可能手动测