请教个国际化的问题,目前我是 10 个语种的 i18n JSON 文件,每当后续有改动时,都要频繁去改 10 个文件,虽然有 Cursor AI 加持,翻译不成问题,但是工作量还是太大。
请问大家有没有自动化检测,然后使用 AI 批量翻译的方案呢,感觉上应该有合适的 CI 方案。

用 babeledit 机翻

维护一份 key value 自动翻译啊

搞个 pipeline ,push 代码的时候对增量代码里的文案做翻译

写个脚本。检查 1 个语种新增的,调用 api 翻译修改其他 9 个文件

用 po/pot 好点吧

之前做了个工具用来解决这个问题,可以试试,现在只接了 deepseek

github.com/ShermanTsang/i18n-translator

OP 是卡在翻译词条的提取? 还是?

翻译来源是哪,如果是外部,直接整个 excel 给出去,定义好映射,只用负责解析就好。

翻译本身直接用的 AI ,倒是没问题

上千行的 key value ,CRUD i18n 都得处理

比如一个 en.json 文件内部,出现任何的 CRUD ,都要在其他剩余的 json 文件进行同步的 CRUD

初始内容翻译简单,难在后续的 CRUD 的同步

是的,想了好久,还是得依赖 git diff 之后做 pipe line ,今天来写一写代码试试

po/pot 原来也是一种文件格式啊,学习了

看了下,感觉不太符合我的场景😄

我也有一样的问题,我是三种语言,也是几千条的 key value ,每次修改,我都新增,因为我懒得找对应的那一条去改掉。导致冗余越来越多

我现在维护三种语言,都是让 GPT 来翻译的。直接把完整文件复制过去,让它把右边引号的内容翻译成指定语言。也就第一次翻译有工作量,后续小修小补都手动来了

github.com/lokalise/i18n-ally
这个插件,自动翻译还能看各语言有没有缺失

sqlite 这种数据库维护 key 和各语言 value 的对应关系,配合导出脚本,update 后自动生成各语言 json ,然后发版呢?

写个脚本处理一下,可以处理全量、增量的逻辑。维护 18 个语种,5 万个词条,常用的脚本 5 ~ 10 个,可以解决新增语言,增量翻译,全量翻译等功能

就自己写脚本就行,不用专门的 ci 工具

google 表格有一个函数是 “GOOGLETRANSLATE” 可以试试
=GOOGLETRANSLATE(B6, "en", "zh")

你只需要设置一个单词,其他语言可以自动翻译 ,如果某个翻译不准确可以手动改当前格子。

翻译好了,下载 文件用程序转化成 json 就可以使用了

zh.wikipedia.org/wiki/ISO_639-1

import * as fs from 'fs'
import * as path from 'path'

function validateJSONKeys(basePath) {
const baseJSON = JSON.parse(fs.readFileSync(path.join(basePath, 'en', 'common.json'), 'utf8'))
const baseKeys = Object.keys(baseJSON)

const folders = fs
.readdirSync(basePath, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name)

console.log('Validation Results:\n')

folders.forEach((folder) => {
if (folder === 'en') return

const filePath = path.join(basePath, folder, 'common.json')
if (!fs.existsSync(filePath)) {
console.log([${folder}] common.json not found.)
return
}

const json = JSON.parse(fs.readFileSync(filePath, 'utf8'))
const keys = Object.keys(json)

const missingKeys = baseKeys.filter((key) => !keys.includes(key))
const extraKeys = keys.filter((key) => !baseKeys.includes(key))

if (missingKeys.length === 0 && extraKeys.length === 0) {
console.log([${folder}] ✓ All keys are present.)
} else {
if (missingKeys.length > 0) {
console.log([${folder}] ✗ Missing keys.)
}
if (extraKeys.length > 0) {
console.log([${folder}] ⚠ Warning: Extra keys found.)
}
}
})
}

// Usage example
const basePath = './public/locales'
validateJSONKeys(basePath)
前端项目要搞 几个 script , 放到 internal 里,类似 site map 生成,npm postbuild 自动跑。

用数据库来统一前后端的这个思路还真不错👍,我看看我的站点怎么改

是的,我现在也在写脚本了😂

赞,贴心把代码贴出来了,感谢

google 还有这种 GOOGLETRANSLATE 函数呢,真不错,学习了👍🏻

这个思路太好了,是不是可以更进一步做成 gui ,可视化查看已有什么语言,各语言下的字段,交互式增加、修改翻译。

感觉你的需求用 weblate 就能实现
docs.weblate.org/en/latest/admin/machine.html

#13
怎么会要依赖 git diff ,老哥你难道没用任何 i18n 框架么。

比如前面有人提到的 .po ,这就是 gnu gettext 的翻译格式,你只要导入库后在代码里写 _("hello"),gettext 就会提取出这些字符串,和你和旧翻译对比、合并,你每次只管翻译就行了。

你的思路没问题,脚本就让 AI 写就好了,我的 deno 脚本已经运行好久了,思路就是以 zh-CN 为主文件,增删改都是只改这一个语言文件,读 git diff ,按行处理和同步到其他语言文件,我也用的 deepseek 翻译。

这个脚本还同时把超大的 json 文件的 key 按字母顺序排序了,也做了多文件的 key 一致性检查,等于是单测。

大型复杂项目里的代码随着时间积累乱的程度还是挺高的, 就只是 _('hello') 这样的根本无法覆盖全部,有太多的情况是字符串拼接的 key 了

我有个初步的开源项目可以满足你的这个需求,还比较初级,不过我自己在用了,你可以看看: github.com/icodesign/dolphin

本质上是按照一个配置文件把项目里面的本地化文件收集起来然后本地会存一个状态,再通过 AI 去翻译,后面就会通过类似于 diff 的方式去更新

话说 CRUD 为什么会出现在 i18n 的文件里面,这些不是应该都在代码逻辑里面么,i18n 文件里面用占位符替代

另外这种专门辅助编辑 i18n 的平台也挺多的,比如 crowdin

react 项目使用 i18next 的话 可以结合 i18next-parser 在 commit 的时候自动扫描并进行翻译

#31
如果一开始没考虑好 i18n 的需求,后期再上确实挺麻烦。

拼接的字符串,只要最终来源是常量,还是可以翻译的。完全动态的字符串,那没有任何手段能预先翻译……

除了翻译的自动化提取合并,i18n 框架都提供了根据单复数或上下文来提供不同翻译的方法,对翻译要求高的话还是很必要的。就算不用现成框架,最后还是会走上造轮子的老路(