Skip to main content
shipi18n logo|Documentation

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

StackTypical locale pathExample
Django / gettextlocale/<lang>/LC_MESSAGES/*.pocheck ./locale -s en
Railsconfig/locales/*.ymlcheck config/locales -s en
Go, Java, .NET with XLIFF*.xlfcheck ./i18n/messages.xlf
Androidres/values-*/strings.xmlcheck app/src/main/res -s en
iOS / macOSLocalizable.xcstringscheck Localizable.xcstrings
Flutterlib/l10n/*.arbcheck 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.