800 字
4 分钟
i18n 工程化:十种语言,不靠硬编码

做多语言最容易犯的错误,是在组件里直接写一句中文,然后想着「以后有空再抽出来」。结果是文案越写越多,最后没人知道哪些已经翻译、哪些还是漏网之鱼。

本站的做法是从一开始就把界面文案集中管理。

一个 Key,十份翻译#

所有用户可见的文案都通过 I18nKey 枚举引用,再交给翻译模块解析。组件里不出现具体语言:

组件里的引用方式
import I18nKey from "@i18n/i18nKey";
import { i18n } from "@i18n/translation";
const title = i18n(I18nKey.archive);

至于 archive 最终显示成「归档」还是「Archive」,由当前语言决定,组件不需要知道。

层级职责
I18nKey定义所有可翻译的文案键
语言模块提供各语言的翻译值
i18n()运行时查找与回退
组件只引用键,不写具体文案

占位符必须同名#

带参数的文案是最容易出错的地方。例如「共 {count} 篇」在每种语言里都必须保留 {count} 这个占位符名,否则替换时就会丢值。

回退策略要明确#

当某个语言缺少某个键时,系统需要一个确定的回退顺序。本站优先使用当前语言,缺失时回退到默认语言,而不是直接显示键名。

为什么不用「自动翻译」省事#

自动翻译可以解决一部分重复劳动,但界面文案往往很短,缺少上下文。一个词在不同页面可能有完全不同的语气。机器翻译很难保证这种一致性。

界面文案是产品语气的一部分,不能只当成字符串替换。

中文站点的特殊处理#

本站默认语言是简体中文,但 i18n 结构并没有因此简化。这样做的好处是:以后如果增加英文界面,不需要回头重构组件,只需要补翻译值。

分类和标签也要翻译吗?

分类、标签和系列名属于内容,不是界面文案。它们由作者直接填写,因此不进入 I18nKey 体系。界面框架(如「分类」「标签」这些标题)才需要翻译。

小结#

i18n 的难点不在翻译本身,而在「让所有文案都有归属」。当每个字符串都能追溯到一个键,遗漏和重复才会变得可见。

对个人博客来说,这套机制可能有点重;但它带来的确定性,在长期维护中很划算。

第 8 篇,共 12 篇本文属于系列

i18n 工程化:十种语言,不靠硬编码
https://www.ycera.cn/posts/i18n-engineering/
作者
初月_Yuechu
发布于
2026-10-27
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取