有 i18n 大佬帮忙看下吗, json 文件的翻译问题,工作量太大🤪

30 天前
 HeyCaptainJack

请教个国际化的问题,目前我是 10 个语种的 i18n JSON 文件,每当后续有改动时,都要频繁去改 10 个文件,虽然有 Cursor AI 加持,翻译不成问题,但是工作量还是太大。

请问大家有没有自动化检测,然后使用 AI 批量翻译的方案呢,感觉上应该有合适的 CI 方案。

5473 次点击
所在节点    程序员
56 条回复
mocococ
30 天前
google 表格有一个函数是 “GOOGLETRANSLATE” 可以试试

=GOOGLETRANSLATE(B6, "en", "zh")

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

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




https://zh.wikipedia.org/wiki/ISO_639-1
XTTX
29 天前
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 自动跑。
HeyCaptainJack
29 天前
@TimePPT 用数据库来统一前后端的这个思路还真不错👍,我看看我的站点怎么改
HeyCaptainJack
29 天前
@fov6363 是的,我现在也在写脚本了😂
HeyCaptainJack
29 天前
@XTTX 赞,贴心把代码贴出来了,感谢
HeyCaptainJack
29 天前
@mocococ google 还有这种 GOOGLETRANSLATE 函数呢,真不错,学习了👍🏻
ltaoo1o
29 天前
@TimePPT 这个思路太好了,是不是可以更进一步做成 gui ,可视化查看已有什么语言,各语言下的字段,交互式增加、修改翻译。
asdjgfr
29 天前
感觉你的需求用 weblate 就能实现
https://docs.weblate.org/en/latest/admin/machine.html
aloxaf
29 天前
@HeyCaptainJack #13

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

比如前面有人提到的 .po ,这就是 gnu gettext 的翻译格式,你只要导入库后在代码里写 _("hello"),gettext 就会提取出这些字符串,和你和旧翻译对比、合并,你每次只管翻译就行了。
ThomasChan
29 天前
你的思路没问题,脚本就让 AI 写就好了,我的 deno 脚本已经运行好久了,思路就是以 zh-CN 为主文件,增删改都是只改这一个语言文件,读 git diff ,按行处理和同步到其他语言文件,我也用的 deepseek 翻译。

这个脚本还同时把超大的 json 文件的 key 按字母顺序排序了,也做了多文件的 key 一致性检查,等于是单测。
ThomasChan
29 天前
大型复杂项目里的代码随着时间积累乱的程度还是挺高的, @aloxaf 就只是 _('hello') 这样的根本无法覆盖全部,有太多的情况是字符串拼接的 key 了
icodesign
29 天前
我有个初步的开源项目可以满足你的这个需求,还比较初级,不过我自己在用了,你可以看看: https://github.com/icodesign/dolphin

本质上是按照一个配置文件把项目里面的本地化文件收集起来然后本地会存一个状态,再通过 AI 去翻译,后面就会通过类似于 diff 的方式去更新
yqs112358
29 天前
话说 CRUD 为什么会出现在 i18n 的文件里面,这些不是应该都在代码逻辑里面么,i18n 文件里面用占位符替代
yqs112358
29 天前
另外这种专门辅助编辑 i18n 的平台也挺多的,比如 crowdin
tuolanzhiren
29 天前
react 项目使用 i18next 的话 可以结合 i18next-parser 在 commit 的时候自动扫描并进行翻译
aloxaf
29 天前
@ThomasChan #31

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

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

除了翻译的自动化提取合并,i18n 框架都提供了根据单复数或上下文来提供不同翻译的方法,对翻译要求高的话还是很必要的。就算不用现成框架,最后还是会走上造轮子的老路(
cnhongwei
29 天前
我前端是使用 lingui js , 后端是 java ,使用 gettext ,写完程序,通过 lingui 的命令或 gettext maven 生成需要翻译的文件。集中翻译可以使用 crowdin,我用过,对这两个工具都兼容。 动态的需要自己先规划好,比如字符串的参数化,如果以前全是动态拼接的,确实很麻烦,不过可以慢慢都修改为这种模式。
mooo
29 天前
vscode 用 i18n-ally 插件,先把要翻译的提取到默认语言,然后翻译成其他语言
echoless
29 天前
hepin1989
29 天前
给钱吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1095668

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX