Quick answer: Set Fallback Locale on each Locale asset. Await LocalizationSettings.InitializationOperation before reading strings. Audit tables for missing keys via the Localization Tables editor.
A localized button label shows #ENTRY_NOT_FOUND: button.start in French, but works in English. The key exists; the French translator added a placeholder; somewhere between authoring and runtime the lookup failed.
Where Lookups Fail
Localization lookup steps:
- Active Locale selected.
- String Table for that locale loaded.
- Key looked up in the table.
- If missing: check Fallback Locale’s table.
- Still missing: return
#ENTRY_NOT_FOUND.
Failure can be at any layer.
Fix 1: Verify Key Exists per Locale
Open Window → Asset Management → Localization Tables. Select your String Table Collection. The matrix shows every key across every locale. Missing entries are highlighted. Fill in or leave blank (fallback kicks in).
Fix 2: Set Fallback Locale
Select each Locale asset:
Locale (French):
Identifier: fr
Fallback Locale: English
Lookups in French that fail to find a key now retry in English. Better than displaying #ENTRY_NOT_FOUND to users.
Fix 3: Wait for Initialization
using UnityEngine.Localization.Settings;
IEnumerator Start()
{
yield return LocalizationSettings.InitializationOperation;
string label = LocalizationSettings.StringDatabase.GetLocalizedString("UI", "button.start");
button.text = label;
}
Without the yield, lookup may run before the locale’s table is loaded. The result is #ENTRY_NOT_FOUND even though the key exists.
Fix 4: Subscribe to Locale Change
For runtime language switching:
LocalizationSettings.SelectedLocaleChanged += locale =>
{
RefreshAllLocalizedText();
};
RefreshAllLocalizedText re-queries every active string after the locale change finishes. Caching the previous value and updating only on event avoids the transient #ENTRY_NOT_FOUND during switch.
Build Inclusion
String Tables only ship in builds if they’re referenced by something or marked Always-Cook. In Player Settings → Publishing, verify Localization Assets are included via Addressables groups, or add tables to Preloaded Assets.
Verifying
Switch language at runtime. Watch the Console for #ENTRY_NOT_FOUND warnings. Should be zero. UI labels update to the new language. Network of fallbacks: if a translator hasn’t translated a key yet, you see English (or your primary) instead of broken text.
“Localization needs fallback + init wait + complete tables. Each layer is a place where #ENTRY_NOT_FOUND lives.”
Add a CI step that runs a script extracting all keys used in code and checking they exist in every locale — catches translator omissions early.