Quick answer: Localization String Tables ride on top of Addressables. If you forgot to build Addressables before the player build, or the tables are not set to Preload All Tables, the data is missing at runtime. Wait on LocalizationSettings.InitializationOperation before reading text.
Here is how to fix Unity Localization Package builds where every label shows the raw table key (UI/MainMenu/PlayButton) instead of the actual translated text. Or worse, every label is blank. Editor preview is fine, the play mode shows perfect Spanish/Japanese/whatever, but a player build either crashes the locale system or loads way too slowly to be usable. The Addressables build step is the single most common cause.
The Symptom
UI text components bound to LocalizedString display key paths instead of translations: UI/MainMenu/Settings on a button that should say Settings. Or LocalizedAudioClips return null. The console shows warnings like Could not load Locale Spanish (es) or Table not found in catalog.
What Causes This
Addressables not rebuilt. Localization tables are Addressable assets. If you build the player without first running Build Addressables Content, the player ships with a stale or empty catalog.
Tables not set to Preload. By default, tables load on demand. The first call to GetLocalizedString may return a fallback while the table loads in the background.
Reading text before initialization. If your UI Awake runs before LocalizationSettings.InitializationOperation completes, every read falls back to keys.
Fallback locale missing. If a key is missing from the active locale and there is no fallback locale, the system returns the key as the rendered string.
The Fix
Step 1: Build Addressables before the player build. Open Window → Asset Management → Addressables → Groups. Click Build → New Build → Default Build Script. Verify a successful build log. Now build your player.
Automate this in CI:
// Editor script invoked from CI
using UnityEditor.AddressableAssets.Settings;
public static class BuildHelpers
{
public static void BuildAddressables()
{
AddressableAssetSettings.BuildPlayerContent();
}
}
Run with: Unity -batchmode -executeMethod BuildHelpers.BuildAddressables -quit.
Step 2: Set tables to Preload. Open Edit → Project Settings → Localization. Under each StringTableCollection, set Preload Behavior to Preload All Tables. This trades a slightly longer initialization for guaranteed availability.
Step 3: Wait for initialization in scripts.
using System.Collections;
using UnityEngine;
using UnityEngine.Localization.Settings;
public class LocalizationBootstrap : MonoBehaviour
{
private IEnumerator Start()
{
yield return LocalizationSettings.InitializationOperation;
// Now safe to fetch localized text
ShowMainMenu();
}
}
Or with async/await:
async void Start()
{
await LocalizationSettings.InitializationOperation.Task;
ShowMainMenu();
}
Step 4: Configure a fallback locale. In Project Settings → Localization → Locale Fallbacks, set every locale to fall back to English (or your shipped baseline). When a key is missing in Spanish but present in English, the engine substitutes the English text rather than rendering the key.
Step 5: Verify the catalog at runtime.
void DebugAvailableLocales()
{
foreach (var locale in LocalizationSettings.AvailableLocales.Locales)
Debug.Log($"Loaded locale: {locale.LocaleName} ({locale.Identifier.Code})");
}
If the log shows fewer locales than you expect, an Addressable group is missing. Open the Addressables window, find the LocalizationGroup, and confirm every locale’s assets are inside.
Common Workflow
For a smooth release process: in CI run the Addressables build, then the player build. In your bootstrap scene, splash for at least the duration of InitializationOperation so no UI shows untranslated text. For urgent text (logos, simple branding) consider not localizing at all to avoid bootstrap delays.
“Localization rides on Addressables. Build Addressables first. Wait for InitializationOperation always. Two rules eliminate the empty-table puzzle.”
Related Issues
For other Localization issues, see Localization Table Not Loading. For Addressables download problems, see Addressables Failed To Load.
Build Addressables. Preload tables. Wait for init. The translations show up.