i18n Translation Missing Key Checker

Add your base-language file and the other language files, and see missing keys and {name} or %s placeholders that do not match, per language. Export a CSV for translators and rebuild the files from the CSV they return.

On-device・No uploadMobile friendlyWorks offline

Your files and input are processed only inside your browser on this device and are never uploaded to our servers.

Base language (e.g. English)
Base language (e.g. English)

The file the other languages are checked against.

Language: —

Translations longer than this multiple of the base text are listed as a possible layout risk.

Rebuild translation files from CSVPaste the CSV a translator returned or choose the file, then build one language file. Dots in keys become nested JSON objects.

How to use

  1. Paste the base-language file (for example English) into “Base language”, or choose a file.

  2. 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.

  3. Click “Compare” to see, per language, the progress in percent and counts of missing keys, empty values, suspected untranslated text and placeholder problems.

  4. Check each key in the issue list. Send translators the table from “Export CSV”.

  5. 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

JSON (.json)YAML (.yml / .yaml)Java .propertiesApple .stringsgettext .po / .pot

Export

CSV for translators (UTF-8 with BOM, CRLF)JSON (nested keys restored).properties.strings

Capability matrix

FeatureSupportNotes
Missing and extra key detectionSupported—
Empty values and text identical to the base (suspected untranslated)SupportedIdentical text is a suspicion, not a confirmed fault
Placeholder check ({name}, {{name}}, {0}, %s, %1$s, ICU argument names)Supported—
Required ICU plural categoriesPartialChecks only whether the categories are present, not the full ICU grammar
HTML tag count comparisonSupportedCompares the number of tags, not their names or pairing
Translation length ratio (layout risk)PartialA character-count guide; it does not measure rendered width
Judging translation quality (meaning, fluency)Not supported—
Machine translation or translation memoryNot supported—
XLIFF, Android strings.xml, ResX and other formatsNot supportedOnly the five formats above are read
Fetching files from a URL or saving to a serverNot supportedInput 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?
Enter the base-language file (for example English) and the file you want to check, then click “Compare”. Missing keys and empty values are listed per language.
Are nested JSON keys compared too?
Yes. Nested keys are compared by their full path, such as “a.b.c”. Flat JSON and .properties files are compared in the same way.
What is a placeholder mismatch?
The base and the translation use different variables or a different order, for example {name} against {nom}, or %s against %d. It can show a raw variable or an error on screen.
Can I give the file to a translator and rebuild it from their CSV?
Yes. Export the table with “Export CSV”, then load the returned CSV in “Rebuild translation files from CSV” and build a JSON, .properties or .strings file.
Does it replace a translation management service?
No. It does not manage translation workflows, translation memory or machine translation. It is for checking that files are complete and consistent.
Can it judge whether the translation is correct?
No. It finds problems that can be checked mechanically: missing keys, changed variables and suspected untranslated text. Meaning and style still need a human reviewer.

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.

No upload

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.

No upload

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.

No upload

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.

No upload

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.

No upload

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.

No upload

Last updated: