在 GitLab CI 中检查翻译
该作业安装 kaeris 包,并在修改了区域设置文件的合并请求上运行 kaeris check。丢失的占位符或缺失的键会使管道失败。它是离线且免费的:无需 API 密钥,无需账户。
KAERIS 翻译了此页面,并通过回译检查了每一行。尚未经过母语人士审阅。 英文原文
配置
该作业
将其添加到 .gitlab-ci.yml。将 --source 更改为你的基础语言文件,将 --langs 更改为你发布的区域设置。rules 块仅在修改了 locales/ 下内容的合并请求上运行作业;删除 changes 行可在每个合并请求上运行它。
i18n-check:
stage: test
image: python:3.12-slim
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
- locales/**/*
script:
- pip install kaeris
- kaeris check --source locales/en.json --langs de,fr --ci
实际运行时打印的内容
kaeris 0.2.35 的输出,捕获于 27 October 2026。每个框的最后一行是 CI 作业看到的退出代码。
作业打印的内容
按顺序运行的两个 script 行。左侧:正常的文件。右侧:de.json 文件,其中包含 {nam} 而不是 {name},并且 checkout 键丢失;作业以退出代码 1 停止。
$ pip install kaeris Collecting kaeris Using cached kaeris-0.2.35-py3-none-any.whl.metadata (26 kB) Using cached kaeris-0.2.35-py3-none-any.whl (131 kB) Installing collected packages: kaeris Successfully installed kaeris-0.2.35 $ kaeris check --source locales/en.json --langs de,fr --ci ✓ de: complete & placeholder-safe ✓ fr: complete & placeholder-safe ✓ all locales complete & placeholder-safe Job succeeded exit code: 0
$ pip install kaeris
Requirement already satisfied: kaeris in C:\Users\Inzagi\AppData\Local\Temp\claude\C--Users-Inzagi-projects-kaeris\bfeebe69-3cfd-4f28-bbe7-e5600be082b9\scratchpad\venv-gl2\Lib\site-packages (0.2.35)
$ kaeris check --source locales/en.json --langs de,fr --ci
✗ 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
ERROR: Job failed: exit code 1
exit code: 1
分三步设置
添加任务
将任务粘贴到
.gitlab-ci.yml中,并设置您自己的--source和--langs。打开合并请求
在一个分支上更改区域设置文件并打开一个合并请求。任务将运行并显示其日志中的所有发现。
要求流水线成功
在项目设置的合并请求下,启用流水线必须成功。然后,一个红色的任务将阻止合并。
我们是如何检查的
页面上的每个命令在编写之前都已运行。未运行的命令也列出了。
运行了什么
script行都已从解析后的 YAML 中提取,并按顺序在一个干净的 Python 虚拟环境中运行,在第一个失败的行停止,就像 GitLab 任务一样。pip install kaeris从 PyPI 下载了 kaeris 0.2.35。干净的文件:退出代码 0。损坏的de.json:退出代码 1。未运行什么
没有使用 GitLab runner 或 Docker 镜像(上面的日志来自一台带有 Python 3.14 的 Windows PC,而不是来自
python:3.12-slim)。rules和changes块仅作为 YAML 解析;GitLab 未对其进行评估。该包声明需要 Python 3.8 或更高版本。
值得了解的选项
对过时的密钥也失败
当翻译包含源文件中已不再存在的密钥时,
--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 复数形式),缺少密钥以及不存在的区域设置文件。比较是本地的、静态的。 它检查什么,以及所有标志
我可以将结果保存为文件吗?
是的:--json 以 JSON 格式打印结果,--sarif PATH 写入 SARIF 报告。如果您想保留它,请将其添加到 artifacts 下。这两个标志都在 kaeris check 的帮助中;我们没有在 GitLab 上运行工件上传。
继续
其他配置示例:GitHub Actions · pre-commit · Make 和 npm 脚本
CLI 参考 · 检查参考 · GitHub Action 参考 · 浏览器中的免费检查 · 浏览器中的翻译