Open-source QA for your i18n locale files. No account, no server, no hosted API — bring your own LLM key, or use the structural checks with no key at all.
Your CI lints your JavaScript, typechecks your types, runs your tests — and then ships a de.json
nobody has read, produced by a model nobody audited.
en: "This will permanently delete your account"
es: "Esto guardará tu cuenta de forma permanente" ← "will save"
Every key present. Every placeholder intact. Build green. Key-diffing checkers pass that file. Only reading it catches it.
npx @shipi18n/cli check ./locales -s enStructural — deterministic, offline, no API key. Missing keys, dropped placeholders
({{name}}, %s, %1$s, $t(...), HTML), collapsed plurals, empty values, coverage.
Exit codes, SARIF for PR annotations, JUnit. JSON, Flutter .arb, Apple .xcstrings.
npx @shipi18n/cli check ./locales -s en --semanticSemantic — an LLM reads each source/translation pair and reports mistranslations, omissions and additions. Your key, changed keys only, 3-pass majority vote. Advisory by default: it warns, it does not fail your build.
Measured on a 228-pair corpus committed before the judge was written, thresholds fixed first: 54/54 planted errors caught, 12/168 false positives on clean pairs (7.1%), glossary 6/6. Label accuracy reproduced as a range, 98.1%–100%, across two runs. The harness is in the repo — run it against your own model.
Everything lives in one monorepo: Shipi18n/shipi18n
| Package | npm | What it does |
|---|---|---|
| @shipi18n/cli | check your locale files, translate them, lock hand-edited strings |
|
| @shipi18n/core | The engine — checks, LLM judge, translation. Use it as a library | |
| @shipi18n/mcp | MCP server — validators for Claude Code, Cursor and friends. No API key needed | |
| vite-plugin-shipi18n | Build-time translation for Vite | |
| shipi18n-github-action | — | Translate locale files in CI with your own key |
The MCP server's four validator tools (check_locales, check_glossary, diff_locales,
review_locales) make zero model calls — review_locales hands the pairs and the criteria back
to your agent, which does the judging with its own inference.
| Example | Stack |
|---|---|
| shipi18n-react-example | Vite + React + react-i18next |
| shipi18n-nextjs-example | Next.js App Router |
| shipi18n-vue-example | Vue 3 + vue-i18n |
| shipi18n-nodejs-example | Node.js + @shipi18n/core |
Shipi18n used to be a hosted translation API with accounts and paid tiers. That service is shut down. There is no key to get and no bill to pay; the current tools run entirely on your machine against a provider you choose.
These packages are deprecated on npm and their repos are archived:
@shipi18n/api · i18next-shipi18n-backend · the standalone shipi18n-cli and
vite-plugin-shipi18n repos (the packages live on in the monorepo).
Apache-2.0 · shipi18n.com · Report a bug