Skip to main content

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

Shipi18ni18n-check
What it isA linter for locale files: checks every translation against the source, locally or in CIOpen-source CLI that checks JSON/YAML locale files and scans code for unused keys
Dropped or renamed placeholderError, per language — {x}, {{x}}, %{x}, %(x)s, %1$s, %@, ICU argumentsYes — ICU and i18next messages are parsed and compared; reported as “invalid keys”
Plural formsChecked against each language’s CLDR categories — ICU plurals, i18next _one/_few/_many keys, Rails YAML, Android and .xcstringsCompares plural branches present in both files; no CLDR-category check (from its source code)
Locale formatsJSON, YAML (incl. Rails), Flutter ARB, Apple .xcstrings, Android strings.xml, gettext PO, XLIFFJSON and YAML
In CIGitHub Action with SARIF annotations; CLI, Docker image, pre-commit hook, single-file downloadNo Action (README has a sample workflow); text output, exit code 1 on problems
Account or API keyNone (an optional LLM review uses your own key)None
PriceFreeFree
LicenseApache-2.0MIT

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.