翻译

使用 pre-commit 检查翻译

使用 pre-commit,一个触及区域设置文件的提交会先运行 kaeris check,并在翻译丢失占位符或密钥时被拒绝。它是离线的、免费的:无需 API 密钥,无需账户。

KAERIS 翻译了此页面,并通过回译检查了每一行。尚未经过母语人士审阅。 英文原文

配置

钩子

将其另存为项目根目录下的 .pre-commit-config.yaml。它是一个本地钩子:pre-commit 构建自己的环境并将 kaeris 从 PyPI 安装到其中,因此无需安装其他任何东西。files 将其限制为暂存 locales/ 下内容的提交。

配置.pre-commit-config.yaml
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
$ 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
$ 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
$ 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

分三步设置

  1. 添加钩子

    将上面的配置另存为 .pre-commit-config.yaml,并设置你自己的 --source 和 --langs。保留版本号,并在升级时提高它。

  2. 安装 git 钩子

    运行 pip install pre-commit,然后每个克隆只需运行一次 pre-commit install。

  3. 像往常一样提交

    暂存 locales/ 下文件的提交会运行检查,并在失败时被拒绝。pre-commit run --all-files 会按需运行相同的检查,例如在 CI 中。

我们是如何检查的

页面上的每个命令在编写之前都已运行。未运行的命令也列出了。

值得了解的选项

问题

是否需要 API 密钥或账户?

否。kaeris check 在其帮助文档中被描述为静态、本地且无 API 的,因此该作业不需要密钥。翻译是一个单独的命令,需要密钥。

检查会捕获什么?

丢失或多余的占位符({name}、%s、{{x}}、ICU 复数形式),缺少密钥以及不存在的区域设置文件。比较是本地的、静态的。 它检查什么,以及所有标志

这会拖慢每次提交的速度吗?

仅暂存匹配 files 的文件的提交。第一次运行会构建钩子环境,这需要网络;后续运行会重用它。我们没有计时,所以这里没有具体数字。

继续

其他配方:GitHub Actions · GitLab CI · Make 和 npm 脚本

CLI 参考 · 检查参考 · GitHub Action 参考 · 浏览器中的免费检查 · 浏览器中的翻译