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 19 — smelted ingots
	&"item.iron_ingot":  "Iron ingot",
	&"item.gold_ingot":  "Gold ingot",
	# 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 hyenas 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":   "Hyenas at the Edge",
	&"event.wolves_at_the_edge.body":    "Hyenas howl in the distance. They will be here by nightfall.",
	&"event.lone_wolf.title":            "Lone Hyena",
	&"event.lone_wolf.body":             "A starving hyena 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",
	&"ui.build_drawer.section.structures": "Structures",
	&"ui.build_drawer.section.furniture":  "Furniture",
	&"ui.build_drawer.section.production": "Production",
	&"ui.build_drawer.section.farm":       "Farm",
	&"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.paint_quarry":                 "Quarry",
	&"tool.stockpile_general":            "Stockpile",
	&"tool.graveyard":                    "Graveyard",
	&"tool.plant_tree":                   "Plant tree",
	# Tree growth stage names (shown in inspect tooltip).
	&"tree.stage.sapling":                "Sapling",
	&"tree.stage.young":                  "Young tree",
	&"tree.stage.growing":                "Growing tree",
	&"tree.stage.mature":                 "Mature tree",
	&"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",
	# Phase 17 — DaySummaryCard end-of-day modal.
	&"ui.day_summary.title":             "Day {day} — {season}",
	&"ui.day_summary.continue":          "Continue",
	&"ui.day_summary.pawns_alive":       "Pawns alive",
	&"ui.day_summary.wolves_on_map":     "Hyenas on map",
	&"ui.day_summary.tension":           "Tension",
	&"ui.day_summary.tension_fmt":       "{t} / 100",
	# Weather labels (weather.<name>)
	&"weather.clear":                    "Clear",
	&"weather.rain":                     "Rain",
	&"weather.storm":                    "Storm",
	&"weather.cold_snap":                "Cold Snap",
	&"weather.unknown":                  "Unknown",
	# Settings checkbox label
	&"ui.settings.show_day_summary":     "Show end-of-day summary",
	# Phase 17 — Stockpile filter chips (StockpilePanel).
	&"ui.stockpile.title":               "Stockpile",
	&"ui.stockpile.priority":            "Priority:",
	&"ui.stockpile.prio.critical":       "Crit",
	&"ui.stockpile.prio.high":           "High",
	&"ui.stockpile.prio.normal":         "Norm",
	&"ui.stockpile.prio.low":            "Low",
	&"ui.stockpile.prio.off":            "Off",
	&"ui.stockpile.accepts":             "Accepts:",
	&"ui.stockpile.accepts_all_hint":    "All",
	&"ui.stockpile.select_all":          "All",
	&"ui.stockpile.clear_all":           "None",
	# Item type chip labels missing from existing table (copper_ore through ash).
	# (item.wood, .stone, .iron_ore, .plank, .stone_block, .flour, .bread, .meal
	#  are already defined above — only the ones below are new.)
	&"item.copper_ore":                  "Copper",
	&"item.silver":                      "Silver",
	&"item.gold":                        "Gold",
	&"item.cloth":                       "Cloth",
	&"item.vegetable":                   "Vegetable",
	&"item.meat":                        "Meat",
	&"item.grain":                       "Grain",
	&"item.medicine":                    "Medicine",
	&"item.tool":                        "Tool",
	&"item.weapon":                      "Weapon",
	&"item.armor":                       "Armor",
	&"item.corpse":                      "Corpse",
	&"item.ash":                         "Ash",
	# Phase 19 — Onboarding hint tour.
	&"hint.welcome":           "Welcome to your settlement. Drag to pan the camera, scroll or pinch to zoom.",
	&"hint.pawn_select":       "Tap a pawn to open their detail panel — HP, hunger, mood, skills, and work priorities.",
	&"hint.build_drawer":      "The Build drawer has four tabs: Designate orders, Build structures, paint Stockpiles, or Cancel a tool.",
	&"hint.stockpile_painted": "Tap your new stockpile to set its accepted items and priority. Pawns will haul matching items here.",
	&"hint.work_matrix":       "Work priorities go 0 (off) to 4 (urgent). Pawns pick the highest-priority work they're capable of.",
	&"hint.day_ended":         "Day ends at dusk. Sleep, mood, and weather all carry into the next day. Plan ahead.",
	&"hint.tour_complete":     "Tour complete. Find more in Settings → Help anytime.",
	&"hint.got_it":            "Got it",
	# Phase 19 — Help modal content.
	&"ui.help.title":                  "Help",
	&"ui.help.close":                  "X",
	&"ui.help.tab.controls":           "Controls",
	&"ui.help.tab.verbs":              "Verbs",
	&"ui.help.tab.priorities":         "Priorities",
	&"ui.help.tab.storyteller":        "Storyteller",
	&"ui.help.tab.tips":               "Tips",
	&"help.controls.heading":          "Camera & Selection",
	&"help.controls.body":             "Drag with mouse or finger to pan the camera.\nScroll wheel or pinch to zoom.\n\nWASD or arrow keys also pan; + / - zoom; Home or C re-centers.\n\nTap a pawn, workbench, or stockpile to open its detail panel.\nRight-click or Escape deselects.\n\nB toggles the Build drawer.\nP opens the Work priority matrix.\nL opens the Alerts log.\n, opens Settings.",
	&"help.verbs.heading":             "Player Verbs",
	&"help.verbs.body":                "Designate - orders pawns to chop trees, mine rocks, dig graves, prevent roofing, or plant new trees.\n\nBuild - queues construction: walls, floors, doors, beds, torches, crates, workbenches, and quarries.\n\nStockpile - paints a zone where items get hauled. Each zone has a filter (which item types) and a priority.\n\nCancel - clears a tool selection or pending designation.",
	&"help.priorities.heading":        "Work Priorities",
	&"help.priorities.body":           "Each pawn has priorities (0-4) per work category. The Work matrix grid lets you tune them.\n\n0 = Off. Pawn won't do this work.\n1 = Background. Only if nothing else fits.\n2 = Low.\n3 = Normal (default).\n4 = Urgent. Drops other work to take this.\n\nNeeds (rest, eat, sleep) always run regardless - you can't starve a pawn by setting priorities.",
	&"help.storyteller.heading":       "Storyteller Events",
	&"help.storyteller.body":          "Each in-game day at 6 AM the Storyteller may roll an event. Categories include nudges (gentle hints), threats (hyenas, raids), wanderers (recruit offers), seasonal beats, disease, resource booms, lore, and milestones.\n\nThreat events auto-pause the sim and show a modal with a choice. Other events show a banner that fades in a few seconds.\n\nThe Storyteller's tension rises and falls based on what happens to your colony - calmer when nothing has happened recently, escalating after kills, damage, or near-misses.",
	&"help.tips.heading":              "Early-game Tips",
	&"help.tips.body":                 "Build at least one bed and one wall before nightfall - pawns sleep on the ground and grow tired, and hyenas come at night.\n\nKeep beds indoors (under a roof). Rain and cold ruin sleep quality.\n\nPaint a stockpile early - items left on the ground decay (corpses, food) or just clutter the map.\n\nWatch tension. If it climbs, slow down and reinforce. The Storyteller is reactive - give it nothing to react to and it stays quiet.\n\nFood priority order: Meal > Bread > Vegetable / Grain / Strawberry > raw Wheat. Cook before eating raw.",
	# Phase 19 — Onboarding section in SettingsMenu.
	&"ui.settings.section.onboarding": "Onboarding",
	&"ui.settings.show_hints":         "Show hints (first session)",
	&"ui.settings.help":               "Help",
	&"ui.settings.reset_hints":        "Reset hints",
	&"ui.settings.hints_reset":        "Hint tour reset. Welcome banner will reappear shortly.",
	# Phase 19 — Hover tooltips for desktop discoverability.
	&"tooltip.pause":                              "Pause sim (Space)",
	&"tooltip.speed_normal":                       "Normal speed (1)",
	&"tooltip.speed_fast":                         "Fast speed (2)",
	&"tooltip.speed_ultra":                        "Ultra speed (3)",
	&"tooltip.save":                               "Save game",
	&"tooltip.load":                               "Load game",
	&"tooltip.settings":                           "Open Settings (,)",
	&"tooltip.build":                              "Open Build drawer (B)",
	&"tooltip.work":                               "Open Work priorities (P)",
	&"tooltip.log":                                "Open Alerts log (L)",
	&"tooltip.fab_build":                          "Toggle Build drawer (B)",
	&"tooltip.tool.chop":                          "Order pawns to chop selected trees for wood",
	&"tooltip.tool.mine":                          "Order pawns to mine selected rocks for stone / ore",
	&"tooltip.tool.dig_grave":                     "Mark a tile for grave digging",
	&"tooltip.tool.no_roof":                       "Prevent auto-roofing on selected tiles",
	&"tooltip.tool.plant_tree":                    "Plant a sapling (1 wood)",
	&"tooltip.tool.build_wall_stone":              "Build stone wall",
	&"tooltip.tool.build_wall_wood":               "Build wood wall",
	&"tooltip.tool.build_floor_wood":              "Build wood floor",
	&"tooltip.tool.build_floor_stone":             "Build stone floor",
	&"tooltip.tool.build_door":                    "Build a door",
	&"tooltip.tool.build_crate":                   "Build a storage crate",
	&"tooltip.tool.build_bed":                     "Build a bed",
	&"tooltip.tool.build_torch":                   "Build a torch",
	&"tooltip.tool.build_workbench_carpenter":     "Build a carpenter's bench",
	&"tooltip.tool.build_workbench_smelter":       "Build a smelter",
	&"tooltip.tool.build_workbench_millstone":     "Build a millstone",
	&"tooltip.tool.build_workbench_hearth":        "Build a hearth",
	&"tooltip.tool.build_workbench_cremation_pyre": "Build a cremation pyre",
	&"tooltip.tool.paint_quarry":                  "Paint a quarry on a stone outcrop",
	&"tooltip.tool.paint_stockpile":               "Paint a stockpile zone",
	&"tooltip.tool.graveyard":                     "Paint a graveyard zone",
	# Crop zone paint tools (no seed cost — pawns sow when free).
	&"tool.paint_crop_wheat":                      "Wheat field",
	&"tool.paint_crop_potato":                     "Potato field",
	&"tool.paint_crop_corn":                       "Corn field",
	&"tool.paint_crop_strawberry":                 "Berry patch",
	&"tooltip.tool.paint_crop_wheat":              "Paint a wheat field. Pawns will sow when free.",
	&"tooltip.tool.paint_crop_potato":             "Paint a potato field. Pawns will sow when free.",
	&"tooltip.tool.paint_crop_corn":               "Paint a corn field. Pawns will sow when free.",
	&"tooltip.tool.paint_crop_strawberry":         "Paint a strawberry patch. Pawns will sow when free.",
}


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