Use Shipi18n from Python, Ruby, Go or Java CI
Shipi18n is a command-line tool, not a library, so it works the same way in any repository: your build never imports it, it only reads your locale files. There is no Python or Ruby package; run the CLI in one of the four ways below. None of them needs an API key or an account.
1. Docker (no Node on the runner)
docker run --rm -v "$PWD:/work" ghcr.io/shipi18n/cli check ./locale -s en
GitLab CI:
i18n:
image: ghcr.io/shipi18n/cli:2
script:
- shipi18n check ./locale -s en --severity 'missing-key=off,untranslated=off,orphan-key=off'2. One file, no npm install
Every release carries shipi18n.mjs, the whole CLI in one file, with a SHA-256 checksum and a GitHub build-provenance attestation. It needs Node 18+ and nothing from the npm registry; you can commit the file to your repo.
curl -fsSLO https://github.com/Shipi18n/shipi18n/releases/latest/download/shipi18n.mjs curl -fsSLO https://github.com/Shipi18n/shipi18n/releases/latest/download/shipi18n.mjs.sha256 sha256sum -c shipi18n.mjs.sha256 node shipi18n.mjs check ./locale -s en
3. pre-commit
# .pre-commit-config.yaml
repos:
- repo: https://github.com/Shipi18n/shipi18n
rev: v2.14.1
hooks:
- id: shipi18n-check
args: ['check', './locale', '-s', 'en']4. GitHub Actions
The GitHub Action bundles the check and annotates the pull request; the repository's language doesn't matter.
Which files it reads
| Stack | Typical locale path | Example |
|---|---|---|
| Django / gettext | locale/<lang>/LC_MESSAGES/*.po | check ./locale -s en |
| Rails | config/locales/*.yml | check config/locales -s en |
| Go, Java, .NET with XLIFF | *.xlf | check ./i18n/messages.xlf |
| Android | res/values-*/strings.xml | check app/src/main/res -s en |
| iOS / macOS | Localizable.xcstrings | check Localizable.xcstrings |
| Flutter | lib/l10n/*.arb | check lib/l10n -s en |
If your project already has a native interpolation check (Rails apps with i18n-tasks can run inconsistent_interpolations in a spec), that works too; Shipi18n is most useful when there's no such check, or you have several formats to cover.