extends Node
## i18n string table — player-visible strings ONLY. Code keys, EN values.
##
## Locked from day one (per CLAUDE.md): no hardcoded display copy in scenes or
## scripts. If you have player-facing text, add a key here and call Strings.t(key).
##
## Locale switching is post-MVP; the indirection lands now so we don't have to
## retrofit the whole game later. When the table grows, move it to a .tres or
## external CSV import; the public API (`Strings.t(key)`) stays the same.

const TABLE: Dictionary = {
	# Phase 0 placeholder — populate as features land.
	&"app.title": "Rimlike",
	&"smoke.hello": "Phase 0 — autoloads online.",
	# Speed controls (top bar)
	&"speed.pause": "‖",
	&"speed.normal": "1×",
	&"speed.fast": "5×",
	&"speed.ultra": "12×",
	# HUD
	&"hud.tick": "Tick: {n}",
	# Phase 11 — in-game clock display ("{d}" = day, "{t}" = "HH:MM")
	&"clock.format": "Day {d}, {t}",
	# Phase 12 — season indicator ("{s}" = season name, "{d}" = 1-indexed day, "{total}" = days per season)
	&"season.spring": "Spring",
	&"season.summer": "Summer",
	&"season.autumn": "Autumn",
	&"season.winter": "Winter",
	&"season.format": "{s} {d}/12",
	# Pawn state labels
	&"pawn.state.idle": "idle",
	&"pawn.state.walking": "walking",
	# Item types (player-visible this phase)
	&"item.wood": "Wood",
	&"item.stone": "Stone",
	&"item.iron_ore": "Iron ore",
	# Item stack count badge  ("{n}" is substituted at call site via .format())
	&"item.stack_count": "×{n}",
	# Phase 6 — new item types (carpenter bench + smelter outputs)
	&"item.plank":       "Plank",
	&"item.stone_block": "Stone block",
	# Phase 7 — food loop and cooking chain item types
	&"item.flour":          "Flour",
	&"item.bread":          "Bread",
	&"item.meal":           "Meal",
	# Phase 7 — cooking workbench labels
	&"workbench.hearth":    "Hearth",
	&"workbench.millstone": "Millstone",
	# Phase 7 — pawn hunger states
	&"pawn.state.eating":   "eating",
	&"pawn.state.hungry":   "hungry",
	# Phase 11 — mood thoughts (player-visible in pawn-detail, Phase 17)
	&"thought.in_darkness": "In darkness",
	# Phase 6 — quality tier labels
	&"quality.shoddy":     "Shoddy",
	&"quality.normal":     "Normal",
	&"quality.excellent":  "Excellent",
	&"quality.masterwork": "Masterwork",
	&"quality.legendary":  "Legendary",
	# Phase 15 — Storyteller UI buttons
	&"ui.go_there": "Go there",
	&"ui.dismiss":  "Dismiss",
	# Phase 16 — Save/Load UI
	&"ui.save":               "Save",
	&"ui.load":               "Load",
	&"ui.saved":              "Saved",
	&"ui.saving":             "Saving…",
	&"ui.no_saves":           "No saves yet.",
	&"ui.continue":           "Continue",
	&"ui.cancel":             "Cancel",
	&"ui.manual_save":        "Manual save",
	&"ui.autosave":           "Autosave",
	&"ui.version_mismatch":   "This save is from an older version (v{v}) — loading may fail. Continue?",
	&"ui.welcome_back":       "Welcome back — away {n}",
	&"ui.welcome_back_min":   "{n} minute",
	&"ui.welcome_back_mins":  "{n} minutes",
	&"ui.welcome_back_hour":  "{n} hour",
	&"ui.welcome_back_hours": "{n} hours",
	&"ui.load_failed":        "Load failed (corrupt or version mismatch).",
	# Phase 15 — Storyteller event titles + bodies (25-event corpus).
	# EventDef factories in EventCatalog carry the English string directly;
	# these keys exist so Strings.t() is the indirection point for future locale
	# switching. When a locale ships, swap EventDef.title/body from these keys
	# instead of touching EventCatalog factories. (%pawn% is substituted by UI.)
	&"event.first_beds.title":           "First Beds",
	&"event.first_beds.body":            "Your settlers slept on the cold ground again. They are starting to ache.",
	&"event.empty_larder.title":         "Empty Larder",
	&"event.empty_larder.body":          "The larder is bare. Spring won't last forever.",
	&"event.no_fire.title":              "No Fire",
	&"event.no_fire.body":               "Without a hearth, the cold will bite by night.",
	&"event.walls.title":                "Walls?",
	&"event.walls.body":                 "Sleeping under stars is romantic until the wolves arrive.",
	&"event.spring_awakens.title":       "Spring Awakens",
	&"event.spring_awakens.body":        "The thaw runs in every stream. Crops will grow fast now.",
	&"event.summers_heat.title":         "Summer's Heat",
	&"event.summers_heat.body":          "The sun beats down. Unsheltered work will tire faster.",
	&"event.autumns_harvest.title":      "Autumn's Harvest",
	&"event.autumns_harvest.body":       "The fields are heavy with the last of the year's bounty.",
	&"event.winters_edge.title":         "Winter's Edge",
	&"event.winters_edge.body":          "Frost has come. The road is closed; you are alone.",
	&"event.a_traveler.title":           "A Traveler",
	&"event.a_traveler.body":            "A weary traveler stumbles toward your gate. They look hungry. Will you welcome them?",
	&"event.the_refugee_family.title":   "The Refugee Family",
	&"event.the_refugee_family.body":    "A family fleeing bandits arrives. They have nothing, but they would work hard.",
	&"event.the_old_soldier.title":      "The Old Soldier",
	&"event.the_old_soldier.body":       "A retired soldier offers his blade for a place by your fire. Combat 8, but old and tired.",
	&"event.the_wandering_healer.title": "The Wandering Healer",
	&"event.the_wandering_healer.body":  "A traveling healer asks for shelter. She brings knowledge of medicine.",
	&"event.wolves_at_the_edge.title":   "Wolves at the Edge",
	&"event.wolves_at_the_edge.body":    "Wolves howl in the distance. They will be here by nightfall.",
	&"event.lone_wolf.title":            "Lone Wolf",
	&"event.lone_wolf.body":             "A starving wolf circles your livestock.",
	&"event.pack_hunt.title":            "Pack Hunt",
	&"event.pack_hunt.body":             "A hunting pack moves through the forest. They smell your colony.",
	&"event.bandit_scouts.title":        "Bandit Scouts",
	&"event.bandit_scouts.body":         "Strange figures watched from the treeline at dusk. Bandits, perhaps.",
	&"event.fever.title":                "Fever",
	&"event.fever.body":                 "%pawn% woke with a fever. The sickness may spread.",
	&"event.a_bad_cut.title":            "A Bad Cut",
	&"event.a_bad_cut.body":             "%pawn% gashed their hand chopping wood. The wound looks deep.",
	&"event.the_sleeplessness.title":    "The Sleeplessness",
	&"event.the_sleeplessness.body":     "%pawn% has barely slept. Something weighs on them.",
	&"event.bountiful_harvest.title":    "Bountiful Harvest",
	&"event.bountiful_harvest.body":     "Your fields exceeded the season. The granary swells.",
	&"event.lumberjacks_luck.title":     "Lumberjack's Luck",
	&"event.lumberjacks_luck.body":      "%pawn% found a copse of unusually thick trees.",
	&"event.veins_of_iron.title":        "Veins of Iron",
	&"event.veins_of_iron.body":         "A miner reports a rich vein, deeper than expected.",
	&"event.strange_stones.title":       "Strange Stones",
	&"event.strange_stones.body":        "Settlers report finding carved stones in the wood — older than any memory.",
	&"event.an_old_map.title":           "An Old Map",
	&"event.an_old_map.body":            "%pawn% found a tattered map. Roads to the north, half-faded.",
	&"event.one_year_survived.title":    "One Year Survived",
	&"event.one_year_survived.body":     "A full year. The first frost feels different now — yours is a real settlement.",
	# Phase 17 — PawnDetailPanel
	&"ui.detail.close":             "X",
	&"ui.detail.hp":                "HP",
	&"ui.detail.hunger":            "Hunger",
	&"ui.detail.sleep":             "Sleep",
	&"ui.detail.mood":              "Mood",
	&"ui.detail.job":               "Job",
	&"ui.detail.idle":              "Idle",
	&"ui.detail.sulking":           "Sulking",
	&"ui.detail.thoughts":          "Thoughts",
	&"ui.detail.statuses":          "Statuses",
	&"ui.detail.skills":            "Skills",
	&"ui.detail.priorities":        "Work priorities",
	&"ui.detail.skill.manual_labor": "Manual",
	&"ui.detail.skill.crafting":    "Crafting",
	&"ui.detail.skill.cooking":     "Cooking",
	&"ui.detail.skill.medicine":    "Medicine",
	&"ui.detail.skill.combat":      "Combat",
	&"ui.detail.sev":               "sev={s}/{m}",
	# Phase 17 — SettingsMenu
	&"ui.settings.title":           "Settings",
	&"ui.settings.speeds":          "Speeds",
	&"ui.settings.shortcuts":       "Pause=Space  1×=1  5×=2  12×=3",
	&"ui.settings.auto_pause":      "Auto-pause",
	&"ui.settings.pause_threat":    "On Threat",
	&"ui.settings.pause_wanderer":  "On Wanderer",
	&"ui.settings.pause_pawn_down": "On Pawn-Down",
	&"ui.settings.pause_modal":     "On Modal",
	&"ui.settings.audio":           "Audio",
	&"ui.settings.master":          "Master",
	&"ui.settings.music":           "Music",
	&"ui.settings.sfx":             "SFX",
	&"ui.settings.ambient":         "Ambient",
	&"ui.settings.accessibility":   "Accessibility",
	&"ui.settings.larger_text":     "Larger Text",
	&"ui.settings.reduce_motion":   "Reduce Motion",
	&"ui.settings.save":            "Save",
	&"ui.settings.cancel":          "Cancel",
	&"ui.settings.btn":             "Settings",
	# Phase 17 — BuildDrawer bottom-sheet.
	&"ui.build":                          "Build",
	&"ui.build_drawer.designate":         "Designate",
	&"ui.build_drawer.build":             "Build",
	&"ui.build_drawer.stockpile":         "Stockpile",
	&"ui.build_drawer.cancel":            "Cancel",
	&"tool.chop":                         "Chop trees",
	&"tool.mine":                         "Mine rocks",
	&"tool.dig_grave":                    "Dig grave",
	&"tool.no_roof":                      "No roof",
	&"tool.build_wall_stone":             "Stone wall",
	&"tool.build_wall_wood":              "Wood wall",
	&"tool.build_floor_wood":             "Wood floor",
	&"tool.build_floor_stone":            "Stone floor",
	&"tool.build_door":                   "Door",
	&"tool.build_crate":                  "Crate",
	&"tool.build_bed":                    "Bed",
	&"tool.build_torch":                  "Torch",
	&"tool.workbench_carpenter":          "Carpenter",
	&"tool.workbench_smelter":            "Smelter",
	&"tool.workbench_millstone":          "Millstone",
	&"tool.workbench_hearth":             "Hearth",
	&"tool.workbench_cremation_pyre":     "Cremation Pyre",
	&"tool.stockpile_general":            "Stockpile",
	&"tool.graveyard":                    "Graveyard",
	&"ui.bill.mode_forever":              "Forever",
	&"ui.bill.mode_count":                "Do X times",
	&"ui.bill.mode_until_n":              "Do until X",
	&"ui.bill.target":                    "Target",
	&"ui.bill.until_count":               "Until count",
	&"ui.bill.completed":                 "Done",
	&"ui.bill.pause":                     "Pause",
	&"ui.bill.remove":                    "Remove",
	&"ui.bill.add_button":                "Add bill",
	&"ui.bill.no_bills_hint":             "No bills. Add one to start crafting.",
	&"ui.workbench.current_bill":         "Current",
	&"ui.workbench.idle":                 "Idle",
}


func t(key: StringName) -> String:
	if TABLE.has(key):
		return TABLE[key]
	push_warning("Strings.t(): missing key %s" % key)
	return String(key)
