Shipi18n vs i18n-check
@lingual/i18n-check is an open-source CLI that checks JSON and YAML locale files for missing and invalid keys, and can scan your source code for unused and undefined keys. Shipi18n is also an open-source checker, with more formats, a GitHub Action and SARIF output — but no source-code scanning.
We make Shipi18n. Every i18n-check fact below links to i18n-check’s own pages, last verified 4 October 2026.
Side by side
| Shipi18n | i18n-check | |
|---|---|---|
| What it is | A linter for locale files: checks every translation against the source, locally or in CI | Open-source CLI that checks JSON/YAML locale files and scans code for unused keys |
| Dropped or renamed placeholder | Error, per language — {x}, {{x}}, %{x}, %(x)s, %1$s, %@, ICU arguments | Yes — ICU and i18next messages are parsed and compared; reported as “invalid keys” |
| Plural forms | Checked against each language’s CLDR categories — ICU plurals, i18next _one/_few/_many keys, Rails YAML, Android and .xcstrings | Compares plural branches present in both files; no CLDR-category check (from its source code) |
| Locale formats | JSON, YAML (incl. Rails), Flutter ARB, Apple .xcstrings, Android strings.xml, gettext PO, XLIFF | JSON and YAML |
| In CI | GitHub Action with SARIF annotations; CLI, Docker image, pre-commit hook, single-file download | No Action (README has a sample workflow); text output, exit code 1 on problems |
| Account or API key | None (an optional LLM review uses your own key) | None |
| Price | Free | Free |
| License | Apache-2.0 | MIT |
Where i18n-check is stronger
- Very widely used: about 306,000 npm downloads a week (25 Sep – 1 Oct 2026)
- Finds unused and undefined keys by scanning react-intl, i18next and next-intl source code — Shipi18n does not
- Parses ICU and i18next messages, so a dropped {name} is caught
- No model or API key anywhere
What i18n-check doesn’t cover
- JSON and YAML only — no ARB, .xcstrings, Android XML, gettext or XLIFF
- No JSON or SARIF output, so no inline PR annotations
- No GitHub Action of its own
In short
Running both is reasonable: i18n-check for unused/undefined keys in your source code, Shipi18n for mobile and gettext formats, CLDR plural categories and annotated PRs.
What the check prints
$ npx @shipi18n/cli check ./locales -s en
🔎 shipi18n check — flat layout, source 'en', 2 target language(s)
✗ de coverage 100.0% 2 error(s), 1 warning(s)
error welcome placeholder-missing — dropped {name}
fix: restore {name} exactly as written in the source
error checkout placeholder-missing — dropped {amount}
fix: rename {betrag} to {amount}
warning checkout placeholder-added — unexpected {betrag}
✓ pl coverage 100.0% 0 error(s), 0 warning(s)
✗ check failed: 2 error(s)No account and no API key. Exit code 1 fails the CI job; the GitHub Action also annotates the PR lines. Quick start
Last verified 4 October 2026 () against these primary sources. Prices and features change; if something here is out of date, open an issue.