Translation health, in CI

Your translations are rotting and nobody is watching.

It scores your locale files, catches every missing key, broken placeholder and stale string, then fails CI the moment a language slips.

Start free ↗Try it liveNo card. First score in under a minute.
polylens.sh/app/projects/acme-analytics
Acme Analytics
source en · 4 target languages · scanned 12m ago
ExportRun scan
OverviewIssuesFilesCI
72
health
Drifting · 72
Project health
▼ 3 since last scan
Drift trend
10 scans
May 1272 now
Source keys
248
translatable
Languages
4
targets
Errors
9
must fix
Warnings
15
should fix
Health matrix
Reads the formats you already ship
JSON·YAML·i18next·react-intl·vue-i18n·FormatJS·Rails i18n·Flutter arb
The problem

Translation files rot silently

Every failure here is mechanical and easy to detect. Nothing in your stack was looking for them.

0

tools in a typical stack watch translation health. It lives in the gap between your linter and your tests.

A raw key shipped

The string was never translated, so your German checkout renders the key itself.

de · checkout
checkout.button.label
A broken placeholder

The translator renamed the token and the string crashed on render.

fr · greeting
Bonjour {{nombre}} · expected {{name}}
English in the French file

Half a feature never got translated and nobody noticed for three weeks.

fr · cart
"Proceed to checkout" = source
A stale translation

You reworded the source weeks ago. The old copy is still live in four languages.

es · billing.hint
source changed · translation did not
13
issue types caught
<1 min
to your first score
1
curl call to gate CI
0
SDKs to install
How it works

Three steps to a green number

1Point Polylens at your files

Paste your JSON or YAML, or pull straight from your Git repo. No SDK, no migration.

en.jsonde.jsonfr.json
{
"nav.home": "Home",
"greeting": "Hi {{name}}"
}
2Get a health score

One number per language and one for the project, with every issue listed and ready to fix.

72
health
de
94
fr
81
es
59
3Gate CI and watch the trend

Fail the build on a regression and chart drift over time, so quality only climbs.

$ node polylens-ci.mjs locales
✖ gate failed · 8 missing keys in ja
exit 1 · build blocked
Try it now

Scan two files, no signup

Edit the source and the German file, then scan. This is the real engine, the same one that watches your repo once you connect it.

en.json · source
de.json · translation
Press scan to see the health score and every issue Polylens finds in these two files.
What it catches

Every way a locale file goes wrong

Missing and orphan keys

Keys in the source but missing from a language, plus dead keys left behind after a refactor.

missing keycheckout.button.labelja
placeholder{{count}} → {{nombre}}es
orphan keylegacy.banner.v1all
Placeholder integrity

Catches {{name}}, {count}, %s and %{var} when they go missing or change between source and translation.

en "Pay {{amount}} now"
fr "Payer maintenant" · {{amount}} dropped
ICU and plural checks

Flags plural and select blocks that get dropped or mangled in a target language.

Markup safety

Spots HTML tags that differ or fall out of balance and would break the rendered string.

Stale detection

Knows when the source changed but the translation stayed put, from scan history alone.

Untranslated copy

Surfaces real sentences left identical to the source, with no false flags on short tokens.

Dropped numbers

A translator lost the 30 in "30 days". Polylens diffs the numbers between source and target.

Broken encoding

Replacement characters and control bytes in a translation are flagged as errors on sight.

Shipped TODOs

TODO, FIXME, and lorem ipsum in a locale file never survive a scan unnoticed.

Punctuation drift

A sentence that ends with a period in the source and nothing in French gets a quiet flag.

Connect it

Three ways into your workflow

Watch translation health from CI, from your Git repo, or through an AI agent. Pick one, or wire up all three.

CI gate
Fail the build on a regression

One endpoint, one exit code. Drop it into GitHub Actions, GitLab CI, or any pipeline, and a slipped language breaks the build like a failing test. Tune it with FAIL_ON, MIN_SCORE and NO_REGRESSION.

Git sync
Pull straight from your repo

Connect a public or private GitHub repo. Polylens pulls the newest locale files and rescans on a single click. No copy paste, no CLI.

MCP
Let an AI agent fix the drift

Give Claude, Cursor, or any MCP client your translation tools over OAuth, with no API key to copy. They score files, list projects, and pull-and-rescan a connected repo.

$ node polylens-ci.mjs locales
gate failed · de regressed 88 → 81
exit 1
Embeddable health badge·Webhook alerts (Team)·Drift trend over time (Team)·Issue export (JSON & CSV)

"Translation drift is the bug class every multilingual team ships and almost none of them measure."

Why Polylens exists

Polylens vs a TMS

A gate, not a platform

A translation management system manages translators. Polylens watches the files your engineers already ship.

Polylens
A TMS
Setup
Paste files or one curl call
Migrate strings into the platform
Where your strings live
In your repo, untouched
In their database
CI gate that fails the build
Yes, built in
Rare or bolt on
Drift health score and trend
Yes
No
Pricing
Per team, from $0
Per translator seat
Built for
Engineers shipping i18n as code
Professional translators
Comparing something specific? vs Lokalise · vs Phrase · vs Crowdin · vs i18n-check · vs Lingo.dev
The dashboard

One number the whole team rallies around

Color carries the meaning. Green is healthy, amber is drifting, red is broken. Click a language and every broken string is listed, ready to fix.

Acme Analytics
source en · 4 languages · 248 keys
Health
72
Open issues
24
deGerman94
98% covered2 issues
frFrench81
88% covered5 issues
esSpanish59
74% covered8 issues
jaJapanese48
52% covered9 issues
Pricing

Priced per team, not per translator

Start free. Upgrade when CI and history matter. Per organization, no per-seat fees, cancel anytime.

Free
$0/mo

For a single project and the occasional check.

  • 1 project
  • Latest scan
  • ×CI gate and tokens
  • ×Git repo import
  • ×AI agents (MCP)
  • ×Webhook alerts
Start free
Most popular
Team
$19/mo

CI gate, drift history, and alerts for a shipping team.

  • 5 projects
  • 90 day history
  • CI gate and tokens
  • Git repo import
  • AI agents (MCP)
  • Webhook alerts
Choose Team
Business
$49/mo

Unlimited projects and full history for scaled products.

  • Unlimited projects
  • Full scan history
  • CI gate and tokens
  • Git repo import
  • AI agents (MCP)
  • Webhook alerts
Choose Business
Compare
Free
Team
Business
Projects
1
5
Unlimited
Locales per project
3
20
Unlimited
Scan history
Latest only
90 days
Full history
Drift trend over time
×
Embeddable health badge
CI gate and tokens
×
Git repo import (public & private)
×
AI agents over MCP
×
Webhook / Slack alerts
×
FAQ

Questions, answered

No. It doesn't replace your files or your translators. It's a quality gate and dashboard that watches the locale files you already keep in your repo. Think Codecov, but for translations.

Keep the translation number green.

Add a project, paste your locales, and get a health score in under a minute. Free to start.