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
| Shipi18n | Lingo.dev | |
|---|---|---|
| What it is | A linter for locale files: checks every translation against the source, locally or in CI | Translation tool: the v1 CLI sends source strings to Lingo.dev’s hosted engine |
| Dropped or renamed placeholder | Error, per language — {x}, {{x}}, %{x}, %(x)s, %1$s, %@, ICU arguments | Not documented as a check (format docs say placeholders are preserved when translating) |
| Plural forms | Checked against each language’s CLDR categories — ICU plurals, i18next _one/_few/_many keys, Rails YAML, Android and .xcstrings | Not documented as a check |
| Locale formats | JSON, YAML (incl. Rails), Flutter ARB, Apple .xcstrings, Android strings.xml, gettext PO, XLIFF | 18 formats incl. JSON, YAML/Rails, ARB, Android XML, .xcstrings, PO, XLIFF, Markdown |
| In CI | GitHub Action with SARIF annotations; CLI, Docker image, pre-commit hook, single-file download | GitHub App opens translation PRs; lingo check fails CI when a translation is missing |
| Account or API key | None (an optional LLM review uses your own key) | Yes — LINGO_API_KEY; bring-your-own LLM key is an Enterprise feature |
| Price | Free | Sandbox $0 (100K tokens/day), Production $99/mo, Enterprise custom; LLM cost passed through |
| License | Apache-2.0 | Legacy 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.