Translation Placeholder Checker

A tool that finds missing or extra keys and missing, added, or renamed {name} placeholders in translation JSON files. Different placeholder order isn't flagged, and type mismatches and unsupported syntax such as ICU plural and select are reported separately — all processed in your browser.

Your translation files are never sent to a server. All checks run in your browser, and your JSON is never modified.
  • Only simple named placeholders like {name} (letters, digits, and _) are supported. Order and repetition don't matter as long as the set of names matches.
  • Escaping follows ICU MessageFormat: text quoted with apostrophes, such as '{' or '{name}', is literal, and '' is a single apostrophe. Ordinary apostrophes such as in don't stay as they are.
  • ICU syntax such as {count, plural, ...} or {gender, select, ...} is not supported and is reported as unsupported rather than passed. Double braces such as {{name}} are reported as unparseable.

Result

Enter the source and translation JSON to check keys and placeholders.

How to use

  1. Paste the source language JSON (e.g. en.json) on the left and the translation (e.g. ja.json) on the right, or load files.
  2. Missing and extra keys, type mismatches, and placeholder differences are listed for each nested key.
  3. Placeholder mismatches show variables missing from the translation and variables not in the source. If both appear, a variable may have been renamed.
  4. Use "Copy" to copy the results as tab-separated text.

About this tool

If {name} in "Hello, {name}" is dropped or renamed to {username} during translation, the screen may show no name or the raw placeholder. This tool checks only keys and placeholders, not the wording of translations.

Placeholders are compared as a set of names, so a different order caused by word order isn't a problem. Escaping follows ICU MessageFormat: text quoted with apostrophes, such as '{name}', isn't treated as a placeholder.

ICU syntax such as {count, plural, ...} isn't supported in this version and is reported as unsupported rather than passed. Non-string values such as numbers and booleans, and values whose types differ between files, are reported separately. Your JSON is never modified or sent to a server.

Compare {"hello":"こんにちは{name}"} with {"hello":"Hello {user}"}. At $.hello, name is reported missing and user extra. Replace the translation with Hello {name} and the placeholder mismatch disappears even though the wording differs.

The checker compares sets of variable names, so repeating a variable a different number of times is not an issue. It also does not judge translation quality. Review the rendered screen and the meaning separately to cover both placeholder consistency and natural language quality.

Frequently asked questions

Does it support i18next's {{name}} format?

This version supports only the {name} format. {{name}} is reported as unparseable syntax.

Is a different placeholder order an error?

No. Word order varies between languages, so it passes as long as the set of placeholder names is the same.

Are array values checked?

Yes. Arrays are compared by index and shown with paths such as $.list[0].