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.