# 7. Localization Pitfalls and VR
Part of [[Localization]]. Previous: [[6. Localizing Game Data Dialogue and Pseudo-Localization]].
> [!note] Verification status
> Items 1, 4 and 5 are stated in the 1.5 docs (Smart flag, `WaitForCompletion` not on WebGL, StringChanged semantics). VR guidance is general practice, not from Unity docs. **Code not compiled in Unity.**
## Pitfalls
1. **Placeholders print literally.** Entry not marked **Smart**.
2. **Sentences built in code.** `"You have " + n + " keys"` can't be translated. Whole sentence in the table, values as variables.
3. **Same key reused for different meanings.** Translators need separate entries ("Close" door vs "Close" distance).
4. **Blocking loads.** `GetLocalizedString()` uses `WaitForCompletion`; it stalls on first load and isn't supported on WebGL. Prefer bindings, `StringChanged`, or async.
5. **Lapsed listeners.** Subscribing to `StringChanged` / `SelectedLocaleChanged` without unsubscribing keeps dead objects alive and throws on destroyed UI.
6. **Shared LocalizedString on a ScriptableObject.** Adding runtime variables to an asset's field affects every user of that asset - create per-instance copies (part 6).
7. **Missing tables in builds.** Addressables weren't built with the player.
8. **Boxes instead of glyphs.** Font lacks the script; set up per-script fonts or fallbacks (part 4).
9. **Clipped German, overflowing Finnish.** Design for 30-40% expansion; test with the Pseudo-Locale.
10. **Language list localized.** Show native names; a player stuck in a language they can't read must still find theirs.
11. **Hard-coded strings in prefabs.** Pseudo-locale brackets reveal them.
12. **Date/number formatting by hand.** Use Smart formats (`{value:N0}`, date formats) so the locale's culture applies.
13. **Input prompts.** "Press E" is wrong on gamepad and on AZERTY keyboards. Use global variables driven by the active device and binding display strings from [[Input System]].
## VR (Quest) notes
VR work in this vault targets **Unity 6.3 LTS (6000.3.27f2+)** ([[0.Choosing a Unity Version]]); Localization 1.5.x runs on Unity 6.x.
- **Legibility first.** World-space text needs larger sizes than screen text; CJK glyphs need even more pixels to stay readable through Quest 2 lenses. Test every locale on device.
- **Expansion in world space** is worse than on screens: a diegetic terminal ([[6.Diegetic Terminal and Wrist Display]]) has fixed physical size. Prefer icons and short labels; allow scrolling.
- **Font atlas memory.** A full CJK font atlas is large; generate only needed characters (static atlas from your tables) or use dynamic atlases with care on Quest's memory budget.
- **Subtitles in VR** should follow the head loosely (lazy-follow) and sit below the horizon line; see [[8.UI Toolkit for VR]].
- **System language on Quest.** The System Locale Selector reads the Android device language on Android; keep the Player Pref selector first so the in-game choice wins.