How to use
Paste the base-language file (for example English) into “Base language”, or choose a file.
Click “Add a language”, enter the language code (such as ja or fr) and paste or choose its file. The format is detected from the contents and the file name.
Click “Compare” to see, per language, the progress in percent and counts of missing keys, empty values, suspected untranslated text and placeholder problems.
Check each key in the issue list. Send translators the table from “Export CSV”.
Load the CSV they return in “Rebuild translation files from CSV”, choose the language and output format, and build the file.
What it does
Reads five formats, detected from content
JSON (nested and flat keys), YAML (including a Rails-style locale root), Java .properties, Apple .strings and gettext .po (with msgctxt and plural msgstr[n]). The format is found from the contents even without a file extension.
Placeholders checked by kind
Reads {name}, {{name}} (i18next), numbered {0} (Java), printf-style %s %d %1$s %@, and ICU argument names such as count in {count, plural, …}, then flags translations whose placeholders differ from the base.
Plural categories checked by language rules
Finds ICU plurals that lack a category the language needs (for example “many” in French), using CLDR rules from Intl. It does not validate ICU syntax in full.
Progress and counts per language
Shows the share of keys with a non-empty translation that differs from the base, and counts each kind of issue.
CSV round trip for translators
Writes one table of key, base text and each language (UTF-8 with BOM for Excel, formula-safe). Rebuilds JSON, .properties or .strings from the CSV that comes back.
Runs only in your browser
Files are not uploaded; they are read and compared in your browser. Useful for text that must not leave your organization.
Use cases
- Before a release, check that keys in the English file are not missing from other language files
- Compare Rails, i18next, Java .properties, iOS .strings or gettext .po files across languages
- Hand translators a CSV and turn their returned text back into JSON or another format
- Find translations that changed or lost a variable such as {count} or %d
- Spot translations so long that they may break button or heading layouts
Supported formats
Read
Export
Capability matrix
| Feature | Support | Notes |
|---|---|---|
| Missing and extra key detection | Supported | — |
| Empty values and text identical to the base (suspected untranslated) | Supported | Identical text is a suspicion, not a confirmed fault |
| Placeholder check ({name}, {{name}}, {0}, %s, %1$s, ICU argument names) | Supported | — |
| Required ICU plural categories | Partial | Checks only whether the categories are present, not the full ICU grammar |
| HTML tag count comparison | Supported | Compares the number of tags, not their names or pairing |
| Translation length ratio (layout risk) | Partial | A character-count guide; it does not measure rendered width |
| Judging translation quality (meaning, fluency) | Not supported | — |
| Machine translation or translation memory | Not supported | — |
| XLIFF, Android strings.xml, ResX and other formats | Not supported | Only the five formats above are read |
| Fetching files from a URL or saving to a server | Not supported | Input is pasted or chosen from your device only |
Limits & notes
- Up to 2 million characters and 20,000 keys per file. Up to 8 files including the base language can be compared.
- “Same as base” applies only to text with at least two letters (of any script). Values of only symbols or numbers are skipped.
- The length ratio is judged only when the base text has at least four characters, not counting spaces.
- ICU is not fully validated (quote escaping and nesting rules are not checked).
- YAML reading covers common files; a YAML file with duplicate keys is rejected.
- Plural translations (gettext msgstr[n]) are compared as “key[n]”.
Privacy & safety
Translation files are read and compared only inside your browser. Nothing is sent to or stored on a server, and keys, translated text and file names are never written to analytics logs. Closing the page clears everything.
FAQ
How do I find missing translations?
Are nested JSON keys compared too?
What is a placeholder mismatch?
Can I give the file to a translator and rebuild it from their CSV?
Does it replace a translation management service?
Can it judge whether the translation is correct?
Related tools
JSON Studio — Formatter & Validator
Paste JSON to format, minify or validate it instantly. Errors are shown with the exact line, column and cause, and comments or trailing commas can be auto-repaired. Your data never leaves your device.
Diff Tool — Text & Code Compare
Paste or drop two versions and see added and removed lines, plus the exact words that changed inside each line. Copy or save the result as a unified patch. Nothing leaves your browser.
CSV Studio
Open CSV files that are slow or garbled in Excel and view, search and edit them right away in your browser. Combine, split and save as CSV (UTF-8 with BOM, Shift_JIS), Excel or JSON on one screen.
UUID / ULID / NanoID / Token Generator
A UUID is ready the moment the page opens. Switch to UUID v7, ULID, NanoID or a random token, generate up to 10,000 at once and save them as .txt, .csv or .json. Paste an existing UUID or ULID to read its embedded time and version.
Regex Tester
Type a pattern and matches light up in the test string instantly. Capture groups, replacement output and what each part of the pattern means are all on one screen — and patterns that would freeze your browser are stopped after one second.
Code Formatter — Format & Minify
Paste code to format it with the language auto-detected. Choose indent, line width, semicolons, quotes and trailing commas; JavaScript, CSS and HTML can also be minified with before/after size and reduction. Your code never leaves the browser.
Last updated: