Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Localization reference

Choose the localization route from the content owner. Cyberpunk 2077 does not resolve journal text, spoken lines, and scene choices through one shared table, even when all three values are called a string or locstring in an editor.

RecordValue
Practical baselineCyberpunk 2077 2.31a, WolvenKit 8.19.0, ArchiveXL 1.27.0, RED4ext 1.30.0, redscript 0.5.31
Lab 1–5 localization resourcesStructurally validated
In-game presentationVerify with the relevant lab’s UI, subtitle, audio, and reload checks

The complete model and property tables are in Localization paths. This page is the lookup and failure reference.

Pick the owning path

Content on screenSource identityRuntime ownerArchiveXL registration
Quest title, phase, objective, description, journal mappin, phone UI, file, shard, or onscreen textTextual LocalizationString.valuelocalizationPersistenceOnScreenEntrieslocalization.onscreens.<locale>
Spoken scene subtitle and VOUnsigned numeric scnlocLocstringId.ruidSubtitle map -> subtitle entries, plus VO map -> WEMlocalization.subtitles.<locale> and localization.vomaps.<locale>
Scene choice labelUnsigned numeric scnlocLocstringId.ruid reached through a screenplay optionScene-embedded scnlocLocStoreEmbeddedNone; it is inside the .scene

ArchiveXL locale keys use a spelling such as en-us. Embedded scene locStore descriptors use identifiers such as en_us, pl_pl, and db_db. Preserve the schema’s spelling; do not normalize one into the other.

Journal and onscreen UI

The exact join is textual:

journal LocalizationString.value
  -> onscreen entry secondaryKey
       -> femaleVariant / maleVariant
Onscreen entry propertyContract used by Labs 1–5
Root data typelocalizationPersistenceOnScreenEntries
Entry typelocalizationPersistenceOnScreenEntry
primaryKey0 in the mod-added textual-key shape
secondaryKeyGlobally unique text equal to LocalizationString.value
femaleVariantAuthored text in the supplied labs
maleVariantOptional override; empty in the supplied labs

Register the cooked JsonResource beneath source\archive, not its .json.json conversion source beneath source\raw:

localization:
  onscreens:
    en-us:
    - mod\cqa\cqa001\localization\en-us\onscreens\cqa001.json

LocalizationString.unk1, a scene line RUID, and a localization primaryKey are not replacements for the textual secondaryKey join.

Spoken scene lines

One unsigned line RUID must survive four joins:

scene screenplayStore.lines[].locstringId.ruid
  +-> subtitle map -> subtitle-entry resource -> entry.stringId
  +-> VO map -> locVoLineEntry.stringId -> femaleResPath / maleResPath -> WEM
Resource or itemDecisive field
scnscreenplayDialogLinelocstringId.ruid
localizationPersistenceSubtitleMapEntrysubtitleFile soft resource reference
localizationPersistenceSubtitleEntryMatching stringId, femaleVariant, maleVariant
locVoLineEntryMatching stringId, femaleResPath, maleResPath
WEMCooked depot resource reached by the VO-map path

The screenplay line’s separate itemId.id is local to that screenplay store and is not the localization ID. Keep the full unsigned 64-bit RUID in the scene, subtitle entries, and VO map.

ArchiveXL registers the subtitle map, not the subtitle-entry resource it references. It registers the VO map, not each WEM:

localization:
  subtitles:
    en-us:
    - mod\cqa\cqa005\localization\en-us\subtitles\cqa005_subtitles_map.json
  vomaps:
    en-us:
    - mod\cqa\cqa005\localization\en-us\vo\cqa005_vo.json

First Contact uses this exact identity and path set:

ItemValue
Authored line keycqa005_contact_line_0001
Unsigned line RUID9638591835734011695
Subtitle mapmod\cqa\cqa005\localization\en-us\subtitles\cqa005_subtitles_map.json
Subtitle entriesmod\cqa\cqa005\localization\en-us\subtitles\cqa005_subtitles.json
VO mapmod\cqa\cqa005\localization\en-us\vo\cqa005_vo.json
WEMmod\cqa\cqa005\localization\en-us\vo\contact_i_85c3283507e7ef2f.wem

The supplied scene, maps, subtitle entry, and WEM contract are Structurally validated. Audible playback and subtitle presentation on the exact cqa005 route are covered by the Lab 5 test guide. Male-versus-female path selection remains Experimental even if that campaign passes, because both fields point to the same WEM and the matrix does not exercise distinct gender-path cases.

Scene choice labels

A choice is an entirely scene-local lookup:

scnChoiceNodeOption.screenplayOptionId.id
  -> screenplayStore.options[].itemId.id
  -> screenplayStore.options[].locstringId.ruid
  -> locStore.vdEntries[] descriptor
  -> descriptor.vpeIndex
  -> locStore.vpEntries[] payload.content
FieldRule
Choice captionAuthoring/debug CName; not authoritative displayed text
Descriptor identityMatch locale, locstring RUID, signature, and variant
vpeIndexZero-based index into vpEntries[]
variantId.ruidPreserve between descriptor and intended payload
Numeric orderingCompare unsigned numeric RUID values, not decimal strings

Observed in vanilla: the four scene resources listed in the vanilla depot-path index group descriptors into locale blocks and sort unsigned locstring IDs within each inspected block. This supports a known-good authoring shape, not a universal theorem about every scene or locale set.

There is no ArchiveXL registration for an embedded choice locStore. Adding a choice RUID to onscreens, subtitles, or vomaps cannot repair its descriptor or payload join.

Symptom routing

SymptomInspect first
Journal entry exists but title/objective is blankLocalizationString.value -> onscreen secondaryKey; primaryKey: 0; localization.onscreens.<locale> registration
Only one player variant is correctBoth femaleVariant and maleVariant; test both intended player configurations
Spoken subtitle is absentScene line RUID -> subtitle stringId; subtitle-map registration; map’s subtitleFile path
Subtitle appears but audio is silentSame RUID in VO map; both WEM resource paths; packed WEM; audio and ArchiveXL logs
Choice caption is right but menu text is blank or staleOption ID -> screenplay option -> locStore descriptor -> vpeIndex -> matching variant payload
Only one embedded locale is wrongThat locale’s descriptor block, numeric ordering, payload indices, and variant identities
A rebuilt string behaves like an older candidateInstalled archive/control-file hashes and a save made before the journal or scene became active

Packing and a clean deserialize prove resource structure, not runtime lookup. Keep the archive and loose configuration together, inspect registration logs, and run journal tests from a pre-install save and scene tests from a save made before scene activation.