Skip to content
Locale Gaps

Translation checks for apps in many languages

Every string gets its visa before it crosses the border.

Locale Gaps compares your source language file with each translation and stops what would break on screen: missing keys, empty or untranslated text, lost placeholders, broken markup and plural forms a language needs but the file does not have. Then it hands translators a file with exactly what is left to do.

What it checks
Entry stampsP<LOCALE<GAPS

What it is

A checker for app translation files. It reads JSON, YAML, .properties, Apple .strings, gettext .po or a plain list of keys and compares every language with the source.

Who it is for

Frontend and mobile developers, product managers shipping in several languages, localization managers and translators who want a clean list instead of a screenshot of a raw key.

What it solves

A missing key shows users text like cart.checkout, a lost placeholder prints {{amount}} instead of a price, and a missing plural form makes Russian or Arabic read wrong. You see all of it before release.

Check your translation files

Paste the source file, add one box per language and press Check translations. Nothing leaves this page.

Source language

The file every other language should match. Nested JSON, YAML with a root like en:, key=value lines, "key" = "value"; lines, .po files or a plain list of keys.

Translation 1

Paste the file for this language. Formats can differ from the source.

Options

Long translations often overflow buttons and menus. 1.6 means 60 percent longer.

Comma separated, for example brand or product names. Numbers, codes and single brand words are already ignored.

Nothing checked yet

Paste a source file and at least one translation, or load the sample app to see a full report.

What it checks

Each rule exists because it has broken a real screen somewhere. None of them needs a model or a guess.

  1. Missing and empty keys

    Every source key must exist in the translation and have text. Otherwise users see cart.checkout or an empty button.

  2. Untranslated text

    Text identical to the source is flagged unless it is a number, a code, a link or a word you allowed, like your brand name.

  3. Placeholders

    Variables like {{name}}, {name}, %s, %1$d, %{name} and :name must match the source exactly. A renamed variable prints nothing.

  4. Plural forms

    Plural rules come from your browser, the same rules apps use. Russian needs one, few and many. Arabic needs six forms. Both ICU messages and i18next suffixes like items_few are checked.

  5. Markup

    Tags like <a>, <b> or <0> must survive translation, or links and emphasis disappear.

  6. Length, extras and duplicates

    Very long translations, keys that exist only in the translation and keys defined twice are listed with lower priority.

How to use it

  1. Paste the source file

    Usually English. Open the file or paste its content. Nested keys are flattened to paths like checkout.pay.

  2. Add each language

    Type the language code and paste its file. Each language can use its own format.

  3. Press Check translations

    Each language gets a stamp with keys present and strings ready to ship, plus a count per issue type.

  4. Fix or hand off

    Filter the findings, then download the file to translate for each language or the full CSV.

  5. Keep the note

    Copy the release note into your pull request or release checklist. The hash shows the report was not edited.

What it does not do

  • It does not judge translation quality or tone. A wrong but complete sentence passes.
  • It does not translate anything and does not send text to any service.
  • YAML support covers the usual locale file shape: nested keys and single line values.
  • Gender and select rules in ICU messages are not checked yet, only plurals.

Questions

Are my files uploaded anywhere?

No. Parsing and checks run in this page. Close the tab and the text is gone.

Why does German show Untranslated for a word that is the same in both languages?

Some words really are the same. Add them to Words that may stay the same and run the check again.

Where do the plural rules come from?

From Intl.PluralRules in your browser, which follows the Unicode CLDR data that most apps use.

Can I check only keys, without text?

Yes. Paste plain lists of keys. Missing and extra keys are reported, the text checks are skipped.

Talk to the builder

Questions, ideas or a job offer? Send a message on X or Telegram.

Support the builder

If this tool saved you time, you can send a tip to this EVM address from your own wallet.

0xd28Fd90eD69092bd01598f237aad33a0cc9c3EeA