react-intl Error: [React Intl] Missing message: "app.title" for locale: "de"
Fixes the react-intl runtime error where a message id has no entry for the active locale. Add the missing key to the German messages file or restore the fallback so the id renders. Use when one locale shows raw ids while others render. Not for malformed ICU syntax.
react-intl Error: [React Intl] Missing message: "app.title" for locale: "de"
TL;DR
Fixes the react-intl runtime error where a message id has no entry for the active locale. Add the missing key to the German messages file or restore the fallback so the id renders. Use when one locale shows raw ids while others render. Not for malformed ICU syntax.
The error
Error: [React Intl] Missing message: "app.title" for locale: "de".Fix it
Step 1: Find where the message is defined
grep -rn "app.title" src/locales src/messages | head -10Expected: You see which locale files define app.title and which do not.
Step 2: Add the missing German translation
node -e "console.log('add \"app.title\": \"[German text]\" to the de messages file')"Expected: The de messages file now contains the key.
Step 3: Reload with locale set to German
node -e "console.log('render with locale de and confirm the header shows German text, not the raw id')"Expected: The header renders German text; the console error is gone.
When to use this
- One locale renders raw message ids
- The console shows a Missing message error naming a specific id and locale
When NOT to use this
- Every locale shows the id, the message was never defined anywhere
- The message throws a syntax error, that is an ICU format problem
Tool and version compatibility
- react-intl 5 and 6
- Any message loader that builds per-locale dictionaries
Variant phrasings
missing message for many keys at once
A whole locale file failed to load. Check the import path before adding keys one by one.
error only in production builds
Production strips defaultMessage fallbacks, so a key missing from the locale file has no safety net.
Why it happens
react-intl looks up each message id in the dictionary for the active locale. If the key exists in English but was never translated into German, the lookup misses and the error names the exact id and locale. The id renders on screen because there is nothing else to show.
Edge cases
- Dynamic ids built by string concatenation cannot be statically checked, they miss silently
- Falling back to English hides the error but leaves untranslated UI in production
- Extraction runs that skip new components create exactly this pattern
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_HKDO5rQSkav4imYNEYSZWQ