使用 pre-commit 检查翻译
使用 pre-commit,一个触及区域设置文件的提交会先运行 kaeris check,并在翻译丢失占位符或密钥时被拒绝。它是离线的、免费的:无需 API 密钥,无需账户。
KAERIS 翻译了此页面,并通过回译检查了每一行。尚未经过母语人士审阅。 英文原文
配置
钩子
将其另存为项目根目录下的 .pre-commit-config.yaml。它是一个本地钩子:pre-commit 构建自己的环境并将 kaeris 从 PyPI 安装到其中,因此无需安装其他任何东西。files 将其限制为暂存 locales/ 下内容的提交。
repos:
- repo: local
hooks:
- id: kaeris-check
name: kaeris check (translations)
entry: kaeris check --source locales/en.json --langs de,fr --ci
language: python
additional_dependencies: ["kaeris==0.2.35"]
files: ^locales/
pass_filenames: false
实际运行时打印的内容
kaeris 0.2.35 的输出,捕获于 27 October 2026。每个框的最后一行是 CI 作业看到的退出代码。
提交打印的内容
左侧:一个文件正常的提交。右侧:一个提交,其中 de.json 有 {nam} 而不是 {name},并且 checkout 键丢失;提交被拒绝。
$ git commit -m "add locales" kaeris check (translations)..............................................Passed [main (root-commit) 96c8a87] add locales 4 files changed, 25 insertions(+) create mode 100644 .pre-commit-config.yaml create mode 100644 locales/de.json create mode 100644 locales/en.json create mode 100644 locales/fr.json exit code: 0
$ git commit -m "break de"
kaeris check (translations)..............................................Failed
- hook id: kaeris-check
- exit code: 1
✗ de: 1 missing key(s): checkout
✗ de: 1 placeholder mismatch(es):
greeting: missing ['{name}'], added ['{nam}']
✗ de: 2 translation fault(s):
greeting: lost placeholder {name}
greeting: invented placeholder {nam} (not in source)
✓ fr: complete & placeholder-safe
✗ 1 missing key, 1 placeholder mismatch, 2 translation faults
exit code: 1
一个不触及区域设置文件的提交
钩子被跳过,因此不相关的提交保持快速。
$ git commit -m "readme" # nothing under locales/ is staged kaeris check (translations)..........................(no files to check)Skipped [main e82b41d] readme 1 file changed, 1 insertion(+) create mode 100644 README.md exit code: 0
分三步设置
添加钩子
将上面的配置另存为
.pre-commit-config.yaml,并设置你自己的--source和--langs。保留版本号,并在升级时提高它。安装 git 钩子
运行
pip install pre-commit,然后每个克隆只需运行一次pre-commit install。像往常一样提交
暂存
locales/下文件的提交会运行检查,并在失败时被拒绝。pre-commit run --all-files会按需运行相同的检查,例如在 CI 中。
我们是如何检查的
页面上的每个命令在编写之前都已运行。未运行的命令也列出了。
运行了什么
pre-commit 4.7.0 在一个全新的 git 仓库中使用上面完全相同的配置:
pre-commit install,然后是实际的git commit运行。钩子环境是从 PyPI (kaeris 0.2.35) 构建的。有效文件:提交成功。损坏的de.json:钩子以退出码 1 失败,git 拒绝了提交。没有 locale 文件的提交:跳过。未运行什么
调用
pre-commit run --all-files的 CI 作业未在运行器上运行。KAERIS 没有已发布的钩子仓库,因此该配方使用本地钩子;没有repo: https://github.com/…行可添加。
值得了解的选项
对过时的密钥也失败
当翻译包含源文件中已不再存在的密钥时,
--strict也会失败。保留品牌名称不变
--glossary 'KAERIS,GitHub'会使丢失其中一个术语的目标失败。相同的列表可以放在kaeris.json的keep下。不同的文件布局
--out是包含翻译的文件夹,--pattern '{lang}/common.json'是它们的文件名。默认:kaeris translate写入的布局。完全没有标志
在项目中有一个
kaeris.json文件(kaeris init会写入一个),kaeris check会从中获取源文件、语言和文件夹。
问题
是否需要 API 密钥或账户?
否。kaeris check 在其帮助文档中被描述为静态、本地且无 API 的,因此该作业不需要密钥。翻译是一个单独的命令,需要密钥。
检查会捕获什么?
丢失或多余的占位符({name}、%s、{{x}}、ICU 复数形式),缺少密钥以及不存在的区域设置文件。比较是本地的、静态的。 它检查什么,以及所有标志
这会拖慢每次提交的速度吗?
仅暂存匹配 files 的文件的提交。第一次运行会构建钩子环境,这需要网络;后续运行会重用它。我们没有计时,所以这里没有具体数字。
继续
其他配方:GitHub Actions · GitLab CI · Make 和 npm 脚本
CLI 参考 · 检查参考 · GitHub Action 参考 · 浏览器中的免费检查 · 浏览器中的翻译