Quick answer: Localization tables ship via Addressables. Ensure the Localization Addressables group builds with your content, a locale is selected, and you wait for the operation to complete.
The Localization package shows translated text in the editor but blank strings in the build — the string tables didn’t make it in, or load asynchronously and weren’t awaited.
Tables Are Addressables
String and Asset Tables are stored as Addressables assets in a generated Localization group. If your build pipeline doesn’t build Addressables (or uses a stale content build), the tables aren’t in the player.
Rebuild Addressables content as part of your build, or use the “build with player” option in Addressables settings.
Select a Locale
var op = LocalizationSettings.InitializationOperation;
await op.Task;
LocalizationSettings.SelectedLocale =
LocalizationSettings.AvailableLocales.GetLocale("en");
Without a selected locale, lookups return empty. Set one after initialization completes.
Await Async Loads
Localized strings load asynchronously. A LocalizeStringEvent component handles this for you; if you fetch strings in code, await the GetLocalizedStringAsync operation — reading .Result before it’s done gives empty.
Verifying
Build and run. All UI shows translated strings. Switching locale at runtime updates text. The Addressables build report includes the Localization group.
“Tables ship through Addressables. Build the content, select a locale, await the loads.”
Add an Addressables content build step to CI — ‘works in editor, empty in build’ is almost always a stale or missing content build.