翻译 i18next 和 JSON 语言环境文件
语言环境 JSON 是嵌套的,其字符串包含像 {{name}} 这样的变量。仅能识别文本的工具可能会重命名键、展平嵌套或翻译变量。KAERIS 会以相同的结构返回文件,并将每个变量保留在原位。
KAERIS 翻译了此页面,并通过回译检查了每一行。尚未经过母语人士审阅。 英文原文
语言环境 JSON 文件是如何构建的
每种语言一个文件(en.json, de.json),或每个命名空间一个文件(locales/en/common.json)。键是与代码的契约,因此只有值会被翻译。i18next 将复数形式写成单独的键(inbox_one, inbox_other);next-intl、Vue I18n 和 FormatJS 将它们放入一个 ICU 字符串中。
{
"nav": { "greeting": "Welcome back, {{name}}!" },
"inbox_one": "{{count}} new message",
"inbox_other": "{{count}} new messages"
}
JSON 翻译中需要注意的事项
三种拼写的变量
i18next 中的
{{name}},ICU 风格库中的{name},以及其他地方的%s或${x}。如果遗漏了一个变量,在运行的应用程序中会显示为空白,而不是错误。某些语言的复数需要更多形式
英语有两种形式。俄语、波兰语和阿拉伯语需要三到六种。对于 ICU 字符串,免费检查会标记 ru、uk、pl、cs、sk、hr、sr、lt、ro、ar、lv、sl 和 he 语言中缺失的形式,以及像
=0这样的精确分支被删除。对于 i18next 后缀键,您的文件需要该语言的额外键;KAERIS 会翻译找到的键。值内的引用和标记
i18next 的
$t(nav.cart),vue-i18n 的@:nav.shop,Trans 组件的<0>…</0>标签以及纯 HTML 都必须得以保留。下面的示例显示了正是这种内容的真实丢失。给自己的备注
路径段以
_开头的键(_comment,_status)被视为服务键,默认情况下不会在 JSON、YAML 和 ARB 中被翻译。
真实运行,之前和之后
真实运行:我们的 97 行测试文件,德语,26 October 2026,截取为四行。最后一行显示了该次运行中捕获到的丢失内容。
{
"ph": {
"mustache": "Hi {{firstName}}, your order {{orderId}} has shipped.",
"reactTrans": "By continuing you accept our <0>Terms</0> and <1>Privacy Policy</1>.",
"nesting": "$t(nav.cart) has been updated"
},
"icu": {
"copiesLeft": "{count, plural, =0 {Sold out} one {Only # copy left} other {Only # copies left}}"
}
}
{
"ph": {
"mustache": "Hallo {{firstName}}, Ihre Bestellung {{orderId}} wurde versendet.",
"reactTrans": "Durch die fortgesetzte Nutzung stimmen Sie unseren <0>Nutzungsbedingungen</0> und <1>Datenschutzrichtlinien</1> zu.",
"nesting": "Der Warenkorb wurde aktualisiert"
},
"icu": {
"copiesLeft": "{count, plural, =0 {Ausverkauft} one {Nur noch # Exemplar} other {Nur noch # Exemplare}}"
}
}
error ph.nesting: lost placeholder $t(nav.cart)
KAERIS 的处理方式
文件相同,结构相同
键、嵌套和顺序与您的源文件保持一致;只有值会发生变化。适用于 i18next、Vue I18n、next-intl 和 FormatJS 文件。
不使用 AI 的变量计数
翻译后,一个简单的计数检查会将每个变量和标签与原始内容进行比较。丢失了变量的行会被标记并显示在顶部。
每行都翻译回来
使用
--verify,每个结果都会被翻译回您的语言,第二个模型会判断含义是否发生变化。您可以阅读每行现在的内容。仅翻译新键
kaeris translate --only-new会翻译新键和已编辑的键;源文件旁边的kaeris.lock会记住其余的键。支持 JSON 和 ARB。
分三步运行
安装 CLI
运行
pip install kaeris。免费额度无需注册账户。翻译文件
运行
kaeris translate en.json --langs de,ja --verify。de.json和ja.json文件将出现在源文件旁边。检查结果
运行
kaeris check --source en.json --langs de,ja。如果变量、数字或键有误,它将以代码 1 退出,从而 CI 可以阻止合并。
pip install kaeris kaeris init --preset i18next kaeris translate en.json --langs de,ja --verify kaeris check --source en.json --langs de,ja
问题
哪些 JSON 布局可用?
扁平化和嵌套的键值文件,如 i18next、Vue I18n、next-intl 和 FormatJS 所使用的。顶层必须是一个对象,例如 {"greeting": "Hello"}。字符串数组也会被翻译。
是否保留 {{count}} 和 $t(…) 引用?
翻译后会比较变量和引用与源文件。丢失了引用的行会被标记;上面的示例显示了一次真实运行,其中 $t(nav.cart) 被删除了,并且检查捕获到了它。
免费吗?
是的,无需账户:每个文件 10,000 个字符,每次运行最多 8 种语言。免费的 API 密钥可将文件限制提高到 50,000 个字符。一次性付费 79 美元,使用您自己的 OpenRouter 密钥;月度套餐起价为 19 美元。价格
我可以在终端或 CI 中运行它吗?
是的。安装 pip install kaeris,然后运行 kaeris translate en.json --langs de,ja。GitHub Action 在拉取请求中运行相同的翻译。 CLI 文档 · GitHub Action
继续
CLI 参考 · 检查参考 · 在浏览器中翻译 · 免费检查 · 格式转换 · 伪本地化
其他格式:YAML · .po · ARB · XLIFF · .strings · .xcstrings · .properties · .resx · CSV · Markdown · Fluent · Android XML