This document defines the stable string ID system for all player-facing text in
TODOS.phase-72.72.11.1.1. It is the naming contract used by source content,
Unreal string tables, translation management systems, voice-over scripts,
screenshots, QA automation, and runtime lookup.
Canonical Format#
Canonical runtime IDs use lowercase ASCII, dot-separated hierarchy, and a
required loc. root:
loc.<domain>.<feature_or_asset>.<role>[.<variant>]
The canonical regular expression is:
^loc\.(?:ui|hud|quest|npc|dialogue|item|combat|mode|tutorial|system|store|liveops|accessibility|privacy|error|region|audio|online)(?:\.[a-z0-9][a-z0-9_-]*){2,}$
Authoring tools may display a short alias such as quest.main_01.title, but the
source-of-truth ID stored in content and exported to localization is always the
canonical loc.quest.main_01.title form.
Reserved Domains#
Reserved domain prefixes keep IDs predictable across content teams:
| Prefix | Owner | Scope |
|---|---|---|
loc.ui |
UI | menus, settings, buttons, modals, option labels |
loc.hud |
UI | HUD counters, trackers, combat prompts, notification chrome |
loc.quest |
Narrative | quest titles, objective text, rewards, quest summaries |
loc.npc |
Narrative | NPC barks, greetings, shopkeeper text, ambient chatter |
loc.dialogue |
Narrative | authored dialogue lines, choices, subtitles, speaker labels |
loc.item |
Gameplay | item names, item descriptions, rarity copy, crafting copy |
loc.combat |
Gameplay | move lists, tutorial prompts, combat system warnings |
loc.mode |
Gameplay | mode names, rules summaries, matchmaking states |
loc.tutorial |
UX | lessons, hints, onboarding steps, controller guidance |
loc.system |
Online | network errors, save prompts, platform notices |
loc.store |
Commerce | storefront labels, bundle copy, purchase confirmations |
loc.liveops |
Live Operations | event news, MOTD, battle pass, compensation notices |
loc.accessibility |
Accessibility | accessibility settings, screen-reader labels, captions |
loc.privacy |
Privacy and Legal | consent, telemetry, data export, privacy notices |
loc.error |
Online | recoverable and fatal error titles, details, actions |
loc.region |
Legal | regional content notices and rating acknowledgements |
loc.audio |
Audio | VO slate text, announcer callouts, subtitle-only audio text |
loc.online |
Online | party, lobby, ranked, replay, and anti-cheat text |
New top-level domains require localization lead approval and a registry update. Subdomains can be added by the owning team when they stay within the canonical regular expression and do not collide with another team.
Required Metadata#
Every string ID entry must carry:
id: canonicalloc.*ID.tmsAlias: short alias without theloc.root for vendor tools.owner: owning discipline or feature team.textRole: semantic role such astitle,body,button,subtitle,choice,toast,error, orscreen_reader_label.sourceLocale: normallyen-US.context: translator-facing description of where the text appears.maxLength: UI budget when the string is layout constrained.screenshotRef: stable screenshot or capture reference when available.variables: named variable list if the string is formatted dynamically.status:reserved,active,deprecated, orblocked.
IDs must be stable across wording changes. Do not include source-language copy,
locale code, punctuation, build numbers, branch names, or actor names that can
change. Use semantic roles instead: loc.ui.menu.options is stable;
loc.ui.menu.open_options_button_text is too close to English copy and should
be avoided.
Examples#
Canonical examples:
loc.quest.main_01.titleloc.ui.menu.optionsloc.npc.blacksmith.greetingloc.item.weapon.ash_saber.nameloc.dialogue.asha.market_intro.line_001loc.system.network.disconnected.titleloc.store.bundle.fighter_pack_01.ctaloc.accessibility.subtitle.speaker_labelloc.privacy.telemetry.opt_out.bodyloc.online.ranked.queue_estimate.body
These IDs demonstrate hierarchical ownership, asset-level grouping, and role suffixes without embedding source copy.
Runtime Rules#
Runtime systems resolve player-facing text by canonical ID. Inline text is allowed only in test fixtures, editor-only debugging, or non-player-facing developer diagnostics. Shipping UI, dialogue, items, mode names, errors, notifications, store copy, accessibility strings, and privacy notices must use registered canonical IDs.
Feature-specific content can keep local fields such as NameTextId,
DescriptionTextId, SourceStringId, or FormatStringId, but those fields
must contain canonical loc.* IDs. Dynamic insertion uses named variables and
must never concatenate translated fragments at runtime.
Migration Policy#
Existing legacy Unreal string table keys such as Menu.Play are treated as
source-table keys until their owning content is migrated. New phase-72
localization work must author canonical loc.* IDs first, then emit any legacy
table key as a derived compatibility alias.
The registry at
V2/ue/Content/Localization/V2/StringTables/StringIdRegistry_V2.json owns the
reserved prefixes and seed examples. The contract at
V2/ue/Content/Localization/V2/StringIdSystem_V2_Contract.json defines the
policy CI validates.
Verification#
Run the focused checker after changing the string ID contract, registry, docs, or CI wiring:
python3 V2/ue/Tools/check-v2-string-id-system.py
Required release gates:
localization-string-id-system-doc-presentlocalization-string-id-system-registry-schemalocalization-string-id-system-canonical-patternlocalization-string-id-system-domain-prefixeslocalization-string-id-system-sample-idslocalization-string-id-system-ci-wired