Strings catalog
story/strings.json (+ strings_<locale>.json): flat key → string map for UI and keyed dialogue.
{
"game.title": "My Novel",
"screen.common.next": "Next",
"choice.yes": "Yes"
}
Usually you need
| Idea | How |
|---|---|
| Literal still works | Most fields accept plain text / label without a catalog |
| Shared copy | Set text_key / label_key / title_key / display_name_key — no sibling text / label needed |
| Standalone fallback | Keep a literal next to a key only when you want a fallback if the key is missing |
| Locale | Overlay strings_<locale>.json |
Some keys live only in the catalog: panel nav labels, notification.* toasts, and other runtime show_key strings. They do not need a matching *_key in your JSON.
Shape
| Form | Meaning |
|---|---|
| Object of string values | Catalog |
| Key with dots | Conventional namespaces (game., screen., choice.) — not enforced |
Missing keys fall back per Translations. check reports a keyed field with no literal and no catalog entry (i18n.missing_key). Used by screens, choices, notifications, window title, character display_name_key, and more.
Translations · Flow tags (literals in script stay in the script file).