Skip to main content
shipi18n logo|Documentation

Quick Start

Check your locale files in about a minute. No account and no API key: the check is deterministic and runs offline. Translating is optional and uses your own LLM key.

1. Check in one command

npx @shipi18n/cli check ./locales -s en

It compares every translation against the source language and reports what breaks at runtime: dropped or renamed placeholders, collapsed plurals, invalid ICU, missing keys. Each finding has a one-line fix:

✗ es  coverage 100.0%  1 error(s), 1 warning(s)
    error  upload.tooBig  placeholder-missing — dropped {max}
           fix: rename {mix} to {max}
✗ fr  coverage 100.0%  1 error(s), 0 warning(s)
    error  trash.deleted  plural-forms — source has 2 plural forms ('|'), fr has 1
           fix: write 2 forms separated by a plain '|', each keeping the source form's placeholders

Exit code 0 means clean, 1 means findings, 2 means the command itself is wrong. It reads JSON, YAML (including Rails), Flutter ARB, Apple .xcstrings, Android strings.xml, gettext and XLIFF. No Node? Use the image: docker run --rm -v "$PWD:/work" ghcr.io/shipi18n/cli check ./locales -s en.

2. Run it on every pull request

The GitHub Action runs the same check and annotates the PR diff. To report only what breaks at runtime (not keys that simply haven't been translated yet), add --severity 'missing-key=off,untranslated=off,orphan-key=off' to the command, or the severity input to the Action.

3. Retranslate what fails (optional, your own key)

Translation calls your LLM provider directly; there is no Shipi18n account or hosted API.

export ANTHROPIC_API_KEY=your-key-here   # or OPENAI_API_KEY with -p openai
npx @shipi18n/cli translate locales/en.json --target es,fr,de

That writes locales/es.json, locales/fr.json and locales/de.json with the same shape as the source. Placeholders are extracted before the request and verified after. Run the check again afterwards: whatever produced a translation, the check is what tells you it still works.

Pick the integration that fits

Migrating from v1?

v1 called a hosted Shipi18n API with a SHIPI18N_API_KEY. That service is retired and the 1.x packages are deprecated. In 2.x the check needs no key at all, and translation uses your own Anthropic or OpenAI key via --provider. The keys and config commands no longer exist: there is no account to configure.