Free tool

Find the keys your translation is missing

Two language files in. Four numbers out: missing, untranslated, done, left over. Plus a file with just the rest to send off.

Runs in your browser. No account, no upload, nothing leaves your machine.

Waiting for a file.

Waiting for a file.

Both files stay in this tab. Nothing is uploaded.

The question every release asks

A locale file drifts the moment someone adds a key and only fills in English. Nothing breaks, no build fails, and the app quietly shows an English sentence to a French user, or the raw key, which is worse. This tool answers the question directly: hand it your source file and one translation, and it tells you exactly which keys are absent, which exist but were never actually translated, and which are left over from a key that no longer exists. Both files are read by format, not by extension, so a .strings on one side and a .xcstrings on the other is fine.

The four marks

What the four marks mean

Missing
The key is in the source file and absent from the translation. This is the plain case: it has never been translated.
Untranslated
The key exists on both sides, but the translated value is empty or character-for-character identical to the source. Identical is a suspicion, not a verdict: OK is OK in French too. It is called out separately because ignoring it is a decision, and not seeing it is an accident.
Translated
The key exists on both sides and the translation has its own text. Nothing to do, and nothing this would cost you to translate again.
Orphan
The key is only in the translated file. Usually a string that was removed from the source and left behind: dead weight that still ships in the bundle.

You only pay for the ones marked + and ~

That is not a metaphor for this page. It is how the product bills. Every string gets a mark: + new, = in memory, ~ source changed. Only + and ~ go to a model and cost tokens. The = never costs anything, not on the tenth release either.

€19 per month incl. VAT, cancellable monthly.

Questions

Which file formats can it read?
JSON, .strings, .xcstrings, .arb, PO, .resx, .properties, CSV, YAML, Android strings.xml and XLIFF. The format is detected from the content, so the two sides do not have to match. Comparing an Xcode String Catalog against a JSON file works.
What is the download button for?
It gives you a file containing only the keys marked + and ~, written in the format of your source file. That is the point of the comparison: if 41 of 3,627 keys are new, you send 41, not the whole file with a request to find the right ones.
Why is a translation that matches the source flagged?
Because it is the most common way an untranslated string hides. Copy-paste during a merge, a translator who skipped a row, a placeholder that was never filled: all three leave a value that is identical to the source. Some of them are correct, which is why it is a separate mark rather than being counted as missing.
Are the files uploaded?
No. Both are read in this tab and never leave it. Two complete locale files side by side give away more than one does: the difference between them shows what is currently being worked on.