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 placeholdersExit 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
CLI
Check locally, in scripts, pre-commit or any CI.
GitHub Action
Check every PR, with inline annotations. No key.
MCP Server
Let your coding agent check locale files. Validators need no key.
Core Library
Call the engine directly from Node.
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.