Skip to main content

Shipi18n vs Lingo.dev

Lingo.dev translates; Shipi18n checks. Lingo.dev’s current CLI sends your strings to its hosted engine to be translated. Shipi18n is a linter that reads locale files — whoever wrote them — and fails CI when a placeholder or plural breaks. They are not the same kind of tool.

We make Shipi18n. Every Lingo.dev fact below links to Lingo.dev’s own pages, last verified 4 October 2026.

Side by side

Shipi18nLingo.dev
What it isA linter for locale files: checks every translation against the source, locally or in CITranslation tool: the v1 CLI sends source strings to Lingo.dev’s hosted engine
Dropped or renamed placeholderError, per language — {x}, {{x}}, %{x}, %(x)s, %1$s, %@, ICU argumentsNot documented as a check (format docs say placeholders are preserved when translating)
Plural formsChecked against each language’s CLDR categories — ICU plurals, i18next _one/_few/_many keys, Rails YAML, Android and .xcstringsNot documented as a check
Locale formatsJSON, YAML (incl. Rails), Flutter ARB, Apple .xcstrings, Android strings.xml, gettext PO, XLIFF18 formats incl. JSON, YAML/Rails, ARB, Android XML, .xcstrings, PO, XLIFF, Markdown
In CIGitHub Action with SARIF annotations; CLI, Docker image, pre-commit hook, single-file downloadGitHub App opens translation PRs; lingo check fails CI when a translation is missing
Account or API keyNone (an optional LLM review uses your own key)Yes — LINGO_API_KEY; bring-your-own LLM key is an Enterprise feature
PriceFreeSandbox $0 (100K tokens/day), Production $99/mo, Enterprise custom; LLM cost passed through
LicenseApache-2.0Legacy CLI Apache-2.0; the v1 @lingo.dev/cli package lists no license on npm

Where Lingo.dev is stronger

  • Large community: about 5,400 GitHub stars
  • Translates 18 file formats, including mobile and Markdown
  • GitHub App that opens translation PRs with no runner setup
  • LLM-based “AI reviewers” for glossary and rule adherence on its platform

What Lingo.dev doesn’t cover

  • A translation tool, not a linter: no documented placeholder or plural check
  • The current CLI needs a Lingo.dev account; the older local CLI (i18n.lock, --frozen) is marked legacy

In short

A coherent pipeline: Lingo.dev (or a TMS, or an AI agent) writes the translations, and shipi18n check gates the PR.

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.