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:

  1. Active Locale selected.
  2. String Table for that locale loaded.
  3. Key looked up in the table.
  4. If missing: check Fallback Locale’s table.
  5. 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.