Skip to main content

Shipi18n vs Crowdin

Crowdin is a hosted localization platform: it imports your source files, coordinates human and machine translation, and syncs the results back. Shipi18n is a linter that checks the locale files in your repo. They do different jobs, and many teams would run both.

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

Side by side

Shipi18nCrowdin
What it isA linter for locale files: checks every translation against the source, locally or in CIHosted platform that imports source files, coordinates translation, syncs results back
Dropped or renamed placeholderError, per language — {x}, {{x}}, %{x}, %(x)s, %1$s, %@, ICU arguments“Placeholders mismatch” QA check, runs in the background; error blocks saving
Plural formsChecked against each language’s CLDR categories — ICU plurals, i18next _one/_few/_many keys, Rails YAML, Android and .xcstrings“ICU syntax” QA check (e.g. flags a missing other form)
Locale formatsJSON, YAML (incl. Rails), Flutter ARB, Apple .xcstrings, Android strings.xml, gettext PO, XLIFFJSON, YAML, ARB, .xcstrings, Android XML, PO, XLIFF — about 50 formats
In CIGitHub Action with SARIF annotations; CLI, Docker image, pre-commit hook, single-file downloadCrowdin CLI and GitHub Action that sync files
Account or API keyNone (an optional LLM review uses your own key)Account required
PriceFreeFree plan; paid plans from $50 (Pro); free open-source license on request
LicenseApache-2.0Proprietary

Where Crowdin is stronger

  • 20 QA checks, the broadest of the three TMSs we compared, including ICU and Android syntax
  • Free plan, plus a free license for open-source projects
  • Strong community / volunteer translation workflow
  • Maintained GitHub Action and CLI

What Crowdin doesn’t cover

  • Its checks cover translations made in Crowdin, not files edited in the repo after the sync
  • An account and project setup before anything runs

Using both

Keep Crowdin for translators, memory and workflow. Add shipi18n check in CI to catch what reaches the repo broken — a dropped placeholder, a plural missing a language's forms, invalid ICU — whether it came from the Crowdin sync, a developer's hand edit or an AI coding agent.

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.