Skip to main content

A translated string renders as nothing at all

A key exists in every locale file but holds an empty value, so the interface shows a blank label, an empty toast or a message with nothing in it — and key-based checks call the file complete.

Rails YAMLJSON

What you see

  • A button, label or shared message renders empty for one language while the layout still reserves its space.
  • Coverage tools report the locale as fully translated, because the key is present.
  • It shows up in features nobody demos in that language: share dialogs, mailers, empty states.

Why it happens

An empty string is a valid translation as far as every loader is concerned. Files acquire them when a key is scaffolded ahead of the copy, when a platform exports an untouched unit as empty rather than omitting it, or when a fragment is cleared during editing. Nothing distinguishes "deliberately blank" from "forgotten" unless something compares against the source.

1Scaffolded keys that never received copy

The key is added in every locale so the file shapes match, and the translation is left for later. Later does not arrive, and the feature ships with an empty string in those languages.

24pullrequests/24pullrequests1.7k★

The share-your-progress tweet is empty in fourteen locales, so the composer opens with no text at all for those users. Polish has the copy; most others have `one:` and `other:` with nothing after them.

Our report — reported alongside a merged placeholder fix →

2Deliberately empty fragments, which are not bugs

A sentence split across `part_1`/`part_2`/`part_3` can legitimately leave one slot empty: Japanese and Korean move the verb to the end, so the opening fragment has nothing to say. Treating those as errors is noise, which is why they are reported as information when their siblings are translated.

hoppscotch/hoppscotch80k★

The SSO instructions split one sentence into three keys; `part_1` is empty in Japanese and Korean while `part_2` and `part_3` carry the whole message.

Our report — the checker was changed rather than the repo →

Find every instance

Empty values are reported against the source, so a key that has text in English and nothing in Spanish is visible:

npx @shipi18n/cli@latest check ./locales -s en

On a large tree, start with `--severity untranslated=off` — intentionally identical strings like product names are common and are not what you are looking for here.

✗ de  coverage 100.0%  2 error(s), 0 warning(s)
    error  dashboard.tweet_progress.one  empty-value — empty translation

How to fix it

  1. 1Translate the key, or remove it so the library falls back to the source language. An empty string is the one outcome that helps nobody.
  2. 2Treat a whole block of empty siblings as a missing feature translation rather than a set of individual gaps.
  3. 3Leave genuinely empty sentence fragments alone. If their siblings carry the sentence, the blank slot is word order, not an omission.

The rules that catch this

How often this actually happens

Across 64 scanned repositories, empty values were the most common finding after placeholder drift: https://shipi18n.com/oss