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

- URL: https://tools.itlibra.com/en/localization-studio
- On-device・No upload
- Last updated: 2026-10-26

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

## 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

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


## Supported formats

### Read

- JSON (.json)
- YAML (.yml / .yaml)
- Java .properties
- Apple .strings
- gettext .po / .pot

### Export

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


## 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?

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.
