{
  "app": {
    "title": "Covel",
    "description": "A plugin-based text RPG framework"
  },
  "home": {
    "startPlaying": "Start Playing",
    "viewRepository": "View Repository",
    "heroEyebrow": "v0.1.0 · A plugin-based text RPG framework",
    "heroLine1": "Build the world,",
    "heroLine2": "run the turn.",
    "heroBody": "Covel is a plugin-based framework for building and running text RPGs. World data, rules, character state, and narrative flow can each live in their own module, or ship together as one playable product.",
    "heroFootnote": "One kernel for play, debugging, and extension.",
    "scrollHint": "Scroll",
    "pipeline": {
      "eyebrow": "Turn pipeline",
      "title": "One execution path you can inspect and extend.",
      "subtitle": "Once player input arrives, the system routes runtimes, assembles context, executes plugins, then writes the result back into state and UI.",
      "diagramAria": "Turn pipeline stages",
      "triggerTitle": "Trigger Router",
      "triggerBody": "All input enters through one entry point, which decides which runtimes should handle this turn.",
      "triggerDetail": "input arrives → 4 runtimes match",
      "contextTitle": "Context Assembly",
      "contextBody": "The system assembles world lore, recent messages, character state, and plugin data into the context for this turn.",
      "contextDetail": "prompt: 8.3k tokens · 71% cache hit",
      "runtimeTitle": "Runtime Runner",
      "runtimeBody": "Runtimes execute according to plugin declarations. Model-backed steps use a model, tool-backed steps use tools.",
      "runtimeDetail": "claude-sonnet-4-6 · streaming…",
      "proposalsTitle": "Proposals",
      "proposalsBody": "Plugins turn their output into typed proposals so narrative, state changes, and UI updates all go through the same kernel layer.",
      "proposalsDetail": "narrative.append · state.patch · ui.render",
      "commitTitle": "Validate & Commit",
      "commitBody": "The commit chain validates, enriches, and stores the result so session state stays consistent.",
      "commitDetail": "5 hooks passed · 12ms commit",
      "renderTitle": "Render",
      "renderBody": "Once the write completes, the chat view, side panels, and plugin surfaces all refresh to the latest result.",
      "renderDetail": "narrative streamed · 3 panels updated"
    },
    "plugins": {
      "eyebrow": "Plugin system",
      "title": "Split gameplay, rules, and surfaces into modules.",
      "subtitle": "Each plugin declares its trigger, priority, and tool scope. The kernel handles scheduling, and the product layer stays replaceable.",
      "narratorBand": "Narrator · 500",
      "narratorBlurb": "Produces the main narrative output and shapes the text the player reads this turn.",
      "worldInitBand": "Pre-Game · 0–99",
      "worldInitBlurb": "Prepares world structure and seed data before the main loop begins.",
      "imageBand": "After-Turn · 700",
      "imageBlurb": "Picks out visual beats from the turn and hands them to the image pass.",
      "memoryBand": "Audit · 1000",
      "memoryBlurb": "Maintains long-lived memory and archival context so longer sessions stay readable.",
      "rulesBand": "Pre-Turn · 200",
      "rulesBlurb": "Handles rules, dice, and modifiers where deterministic logic belongs.",
      "charactersBand": "After-Turn · 600",
      "charactersBlurb": "Tracks NPCs, relationships, and character fields as structured records.",
      "footnote": "Bundled plugins are ready to use, and custom plugins follow the same contract.",
      "unfilledSlot": "Awaiting a plugin to claim this capability."
    },
    "demo": {
      "eyebrow": "Product UI",
      "title": "The landing page shows the real workspace.",
      "subtitle": "The center pane runs the session, side panels host plugins, and world plus model configuration stays in the same interface.",
      "videoAria": "Recording of a Covel session in progress",
      "stat1Label": "Plugins active",
      "stat1Value": "8",
      "stat2Label": "Avg. first token",
      "stat2Value": "~640ms",
      "stat3Label": "Backends supported",
      "stat3Value": "4",
      "stat4Label": "Lines of plugin code",
      "stat4Value": "Yours"
    },
    "cta": {
      "eyebrow": "Next step",
      "line1": "Start a session,",
      "line2": "or start a project.",
      "playLabel": "Start playing",
      "playBody": "Choose a world, configure a model, and open a session.",
      "playAction": "Open Studio",
      "authorLabel": "Author a plugin",
      "authorBody": "Start with PLUGIN.md and a manifest, then connect your rules, tools, and panels into the product.",
      "authorAction": "Read the guide",
      "contribLabel": "Read the architecture",
      "contribBody": "The repo is split by package and plugin, with clear entry points for product work and deeper integration.",
      "contribAction": "Browse repo"
    },
    "forPlayersEyebrow": "For players",
    "forPlayersTitle": "Step into a story that listens.",
    "playerPointStart": "Start an adventure in seconds.",
    "playerPointStartDesc": "No setup. Pick a world, hit Start Playing, and the narrator responds to your words.",
    "playerPointWorld": "Pick the world that fits your mood.",
    "playerPointWorldDesc": "Cyberpunk, high fantasy, or slow-burn mystery — each world is a self-contained setting with its own tone.",
    "playerPointModel": "Choose how the AI thinks.",
    "playerPointModelDesc": "Swap the underlying model per-slot — fast drafts, deeper reasoning, or your own provider key.",
    "underTheHoodEyebrow": "Under the hood",
    "underTheHoodHint": "For the curious — you don't need to care to play.",
    "debuggerLink": "Open Debugger"
  },
  "nav": {
    "home": "Home",
    "play": "Play",
    "world": "World",
    "worlds": "Worlds",
    "session": "Session",
    "plugins": "Plugins",
    "images": "Images",
    "settings": "Settings",
    "studio": "Studio",
    "debug": "Debugger",
    "primary": "Primary",
    "getStarted": "Get Started"
  },
  "session": {
    "config": "Studio Config",
    "status": "Session Status",
    "providers": "Active Providers",
    "plugins": "Loaded Plugins",
    "editConfig": "Edit Configuration",
    "executionStream": "Execution Stream",
    "inputPlaceholder": "Enter action or command...",
    "inputPlaceholderAny": "Send a message...",
    "inputAriaLabel": "Story input — press Enter to send",
    "inputKbdHint": "to send",
    "ended": "This session has ended.",
    "game": "Game",
    "events": "Events",
    "codex": "Codex",
    "eventsTitle": "Events",
    "codexTitle": "Codex",
    "state": "State",
    "world": "World",
    "lore": "Lore",
    "activeModels": "Active Models",
    "noGameState": "No game state yet. State will appear as the story progresses.",
    "worldState": "World State",
    "characters": "Characters",
    "quests": "Quests",
    "inventory": "Inventory",
    "combat": "Combat",
    "memoryArchive": "Memory Archive",
    "noCharacters": "Characters will appear here once created.",
    "noQuests": "No quests yet.",
    "statePatchesTitle": "State Patches",
    "noStatePatches": "No state changes yet.",
    "recordsTitle": "Records",
    "noRecords": "Long-term records will appear here as the story progresses.",
    "npcInitComplete": "NPC initialization complete",
    "npcInitCount": "{{count}} NPC created",
    "slotDefault": "Default",
    "slotFast": "Fast",
    "slotBalance": "Balance",
    "slotImage": "Image",
    "emptyInit": "Preparing your adventure...",
    "emptyCharCreate": "Waiting for character creation...",
    "emptyPlaying": "Adventure awaits. Send a message to begin.",
    "emptyEnded": "This session has ended.",
    "noModelsConfigured": "No models configured",
    "preparation": "Session Setup",
    "history": "Previous Sessions",
    "worldLore": "World Document",
    "worldTab": "World",
    "worldDocumentEmpty": "No world document",
    "database": "Database",
    "dbTables": "table(s)",
    "dbVolumes": "{{count}} volume(s)",
    "dbCoreSection": "Core",
    "dbPluginsSection": "Plugins",
    "dbLoadError": "Load failed",
    "dbEmpty": "No state tables yet. Data will appear here once plugins produce it.",
    "refresh": "Refresh",
    "retry": "Retry",
    "resetLore": "Reset to original",
    "configureKeys": "Configure API Keys & Presets",
    "beginAdventure": "Begin Adventure",
    "beginAdventureHint": "Ready? Click below to let the story begin.",
    "startGame": "Start Game",
    "selectWorld": "Choose a world",
    "worldSelectDesc": "Each world is a self-contained setting — its own tone, characters, and ruleset. Pick one to begin.",
    "loadingWorlds": "Loading worlds...",
    "worldsHeaderEyebrow": "{{count}} worlds available",
    "worldsHeaderEyebrow_one": "{{count}} world available",
    "aiCreateTeaser": "Spin up a brand new world from a one-line idea.",
    "aiCreateAction": "Describe your idea",
    "enter": "Enter",
    "worldsEmptyTitle": "No worlds yet",
    "worldsEmptyDesc": "Generate a new world with AI, or add a world package under the worlds/ folder.",
    "worldsEmptyViewExamples": "View examples",
    "pluginsLoaded": "{{count}} plugins loaded",
    "noPluginsLoaded": "No plugins loaded",
    "resume": "Resume",
    "modified": "Modified",
    "priority": "Priority",
    "reset": "Reset",
    "noRuntimes": "No runtimes",
    "loreModified": "Modified ({{count}} chars)",
    "loreOriginal": "Original ({{count}} chars)",
    "lorePlaceholder": "Enter world lore in Markdown...",
    "switchSession": "Switch session",
    "currentWorld": "Current session",
    "sessions": "Sessions",
    "noOtherSessions": "No other sessions",
    "commands": "Commands",
    "startingUp": "Starting up...",
    "retryFrom": "Retry from {{label}}",
    "executionSummary": "Execution · {{count}} runtimes",
    "executionFlow": "Execution Flow",
    "executionFlowHint": "Turn order — lower priority runs first.",
    "executionFlowTitle": "Plugins run in priority order every turn. Pre-Turn and After-Turn band the narrator on either side.",
    "retryAll": "Retry All",
    "retryAllTitle": "Re-execute all",
    "statusLlm": "Calling model",
    "statusPreparing": "Preparing",
    "breadcrumbWorldSelect": "Select World",
    "breadcrumbPrep": "Prepare",
    "breadcrumbGame": "Playing",
    "runtimePersona": "Persona",
    "runtimeNarrator": "Narrative",
    "runtimeInitWizard": "Character Creation",
    "runtimeGuide": "Guide",
    "runtimeCharTracker": "Character Tracker",
    "runtimeBindings": "Model Bindings",
    "needsConfig": "Needs config",
    "allBound": "All bound",
    "unboundRuntimes": "Unbound runtimes",
    "noCompatibleSlot": "No compatible slot",
    "selectSlot": "-- Select slot --",
    "autoAssign": "Auto Assign",
    "deleteConfirmTitle": "Delete Session",
    "deleteConfirmDesc": "This will permanently delete the session and all its data (messages, game state, etc.). This action cannot be undone.",
    "slotsConfigured": "{{count}} slot(s) configured",
    "slotsUnconfigured": "Not configured",
    "bindingsAllBound": "All bound",
    "bindingsPartial": "Some unbound",
    "historySummary": "{{count}} session(s)",
    "loreSummary": "{{count}} chars",
    "loreSummaryHint": "{{count}} characters · click to edit world lore",
    "pluginsSummary": "{{pluginCount}} plugins, {{runtimeCount}} runtimes",
    "pluginsSelected": "plugins selected",
    "searchPlugins": "Search plugins, tags, capabilities",
    "pluginGroups": {
      "core": "Core",
      "setup": "Setup",
      "traditional": "Traditional story",
      "dialogue": "Dialogue mode",
      "characters": "Characters",
      "memory": "Memory & retrieval",
      "guidance": "Guidance",
      "utility": "Utility"
    },
    "pluginPacks": {
      "traditional-story": {
        "label": "Traditional Story",
        "description": "Narrator, suggestions, codex, and relationship memory for long-form exploration."
      },
      "dialogue-mode": {
        "label": "Dialogue Mode",
        "description": "Dialogue-first narration, scene cast state, quick replies, and character profiles."
      },
      "low-cost": {
        "label": "Low Cost",
        "description": "Keeps the core loop and function plugins while reducing downstream LLM calls."
      }
    },
    "recommendationReasons": {
      "requiredByWorld": "Required by world",
      "packOptional": "Pack optional",
      "recommendedByWorld": "Recommended by world"
    },
    "exportDimensions": "Export Dimensions",
    "importDimensions": "Import Dimensions",
    "dimensionsImported": "Imported successfully",
    "reasonConnectionClosed": "Connection closed but backend did not report completion",
    "selectionsReady": "{{count}} selection(s) ready",
    "confirmSelections": "Send selections",
    "viewParsed": "Parsed",
    "viewDetailed": "Detailed",
    "viewRaw": "Raw",
    "viewParsedAria": "Parsed view",
    "viewDetailedAria": "Detailed view",
    "viewRawAria": "Raw view",
    "stateStreaming": "Streaming",
    "statePlaying": "Playing",
    "toggleStoryPanel": "Toggle story sidebar",
    "debugTraces": "Debug Traces",
    "toggleContextPanel": "Toggle State & World Context",
    "removeDraft": "Remove this selection",
    "composerBlockedPlaceholder": "Complete the current interaction first",
    "composerBlockedHint": "Submit or remove the current plugin interaction before sending another message.",
    "suspensionsBadge": "{{count}} waiting",
    "suspensionsTitle": "Suspended executions",
    "suspensionsDescription": "Runtimes paused for external data. Enter resume data below to continue.",
    "suspensionsEmpty": "No suspended executions.",
    "suspensionResumeLabel": "Resume",
    "suspensionCancelLabel": "Abandon",
    "suspensionResumePlaceholder": "resume data (JSON or text)",
    "suspensionAgoSeconds": "{{count}}s ago",
    "suspensionAgoMinutes": "{{count}}m ago",
    "suspensionAgoHours": "{{count}}h ago",
    "suspensionAgoDays": "{{count}}d ago",
    "memoryStoreWarning": "Data lost on restart",
    "worldDataPreflight": {
      "title": "World Data",
      "loading": "Checking",
      "ready": "{{count}} item(s) will be imported",
      "empty": "No import plan",
      "emptyDetail": "This world has no worldData import plan.",
      "warnings": "{{count}} warning(s)",
      "errors": "{{count}} error(s)",
      "failed": "Check failed",
      "retry": "Retry",
      "moreTargets": "{{count}} more"
    },
    "dbSchema": "Schema",
    "dbValues": "Values",
    "provider": "provider",
    "store": "Store",
    "dbPluginData": "Plugin Data",
    "dbValueEmpty": "(empty)",
    "worldStorage": "World storage",
    "system": "system",
    "player": "Player",
    "assistant": "Assistant",
    "storage": {
      "browserIndexedDb": "Browser IndexedDB",
      "serverFile": "Server file",
      "serverBackend": "Server {{backend}}",
      "builtIn": "Built-in",
      "serverStore": "Server store",
      "server": "Server"
    }
  },
  "blocks": {
    "actionPlaceholder": "Or type your own action...",
    "actionGo": "Go",
    "actions": "Actions"
  },
  "world": {
    "dimensions": "World Dimensions",
    "viewDetails": "View Details",
    "backToList": "Back to List",
    "noData": "No data available",
    "noStructuredData": "No structured data available",
    "dimensionsEmpty": "No world dimension data generated yet.",
    "geography": "Geography",
    "geographyOverview": "Overview",
    "regions": "Regions",
    "climate": "Climate",
    "landmarks": "Landmarks",
    "factions": "Factions & Organizations",
    "factionType": "Type",
    "influence": "Influence",
    "leader": "Leader",
    "headquarters": "Headquarters",
    "relations": "Relations",
    "powerSystem": "Power System",
    "powerType": "System Type",
    "rules": "Rules",
    "tiers": "Tiers",
    "history": "History",
    "era": "Era",
    "economy": "Economy",
    "currencies": "Currencies",
    "resources": "Resources",
    "tradeNotes": "Trade Notes",
    "socialStructure": "Social Structure",
    "classes": "Classes",
    "races": "Races",
    "tone": "Tone & Style",
    "genres": "Genres",
    "contentRating": "Content Rating",
    "narrativeStyle": "Narrative Style",
    "themes": "Themes",
    "mechanics": "Game Mechanics",
    "combatStyle": "Combat Style",
    "skillSystem": "Skill System",
    "difficulty": "Difficulty",
    "customRules": "Custom Rules",
    "startingConditions": "Starting Conditions",
    "openingScenario": "Opening Scenario",
    "playerConstraints": "Player Constraints",
    "startingLocation": "Starting Location",
    "startingResources": "Starting Resources",
    "influenceMajor": "Major",
    "influenceMinor": "Minor",
    "ratingAllAges": "All Ages",
    "ratingTeen": "Teen",
    "ratingMature": "Mature",
    "combatTurnBased": "Turn-based",
    "combatRealTime": "Real-time",
    "combatNarrative": "Narrative",
    "combatNone": "None",
    "difficultyEasy": "Easy",
    "difficultyNormal": "Normal",
    "difficultyHard": "Hard",
    "difficultyAdaptive": "Adaptive",
    "factionTypePolitical": "Political",
    "factionTypeGuild": "Guild",
    "factionTypeCorporate": "Corporate",
    "factionTypeReligious": "Religious",
    "factionTypeCriminal": "Criminal",
    "factionTypeMilitary": "Military",
    "factionTypeOther": "Other",
    "relationAllied": "Allied",
    "relationNeutral": "Neutral",
    "relationHostile": "Hostile",
    "relationVassal": "Vassal",
    "name": "Name",
    "description": "Description",
    "year": "Year",
    "significance": "Significance",
    "significanceMajor": "Major",
    "significanceMinor": "Minor",
    "symbol": "Symbol",
    "rank": "Rank",
    "notes": "Notes",
    "key": "Key",
    "value": "Value",
    "add": "Add",
    "remove": "Remove",
    "addRegion": "Add Region",
    "addLandmark": "Add Landmark",
    "addFaction": "Add Faction",
    "addRule": "Add Rule",
    "addTier": "Add Tier",
    "addEvent": "Add Event",
    "addCurrency": "Add Currency",
    "addResource": "Add Resource",
    "addClass": "Add Class",
    "addRace": "Add Race",
    "addCustomRule": "Add Custom Rule",
    "addConstraint": "Add Constraint",
    "addResource_kv": "Add Resource Entry",
    "saveFailed": "Save failed",
    "powerTypeMagic": "Magic",
    "powerTypeTechnology": "Technology",
    "powerTypeCultivation": "Cultivation",
    "powerTypePsychic": "Psychic",
    "powerTypeHybrid": "Hybrid",
    "powerTypeOther": "Other",
    "aiCreate": "AI Create World",
    "aiCreateTitle": "Describe the world you want.",
    "aiCreateDesc": "One sentence is enough. The model writes the lore, schemas, and starting state.",
    "aiPromptLabel": "World Concept",
    "aiPromptPlaceholder": "Describe your world, e.g.: A steampunk sky city with floating islands...",
    "aiPromptPlaceholderFull": "Describe your world, e.g.: A steampunk sky city whose inhabitants trade between islands in the clouds using airships...",
    "aiPromptExamples": [
      "A steampunk sky city whose inhabitants trade between cloud-borne islands using airships",
      "A cyberpunk post-apocalypse where humans and AIs coexist in neon-lit underground cities filled with hacker culture",
      "An eastern xianxia world where cultivators train among floating mountains while demons prowl the lands",
      "A post-apocalyptic wasteland where survivors form tribes across the radioactive plains"
    ],
    "aiExamples": "Try these for inspiration:",
    "aiGenerate": "Generate World",
    "aiRetry": "Retry",
    "aiGenerating": "AI is building the world...",
    "aiValidating": "Validating world data...",
    "aiSaving": "Saving world...",
    "aiDone": "World created successfully!",
    "aiError": "Generation failed",
    "delete": "Delete world",
    "deleteConfirmTitle": "Delete world?",
    "deleteConfirmDesc": "This will permanently delete \"{{name}}\". This action cannot be undone.",
    "deleteConfirmAction": "Delete"
  },
  "settings": {
    "storageMode": "Data Storage",
    "storageLocal": "Local",
    "storageRemote": "Remote",
    "configuredDesc": "llm.toml configured. Manage API keys and advanced parameters.",
    "unconfiguredDesc": "Configure model slots, API keys, and advanced parameters. All data is stored locally in your browser.",
    "configuredByToml": "Base slots come from llm.toml. Frontend preset overrides are saved on this client.",
    "slotPingMovedHint": "To test connectivity, use Ping in the API Keys pane (or the active-model list).",
    "language": "Interface Language",
    "langZh": "简体中文",
    "langEn": "English",
    "appearance": "Appearance",
    "appearanceModern": "Modern",
    "appearancePaper": "Paper",
    "themeLibraryTitle": "Theme Library",
    "themeLibraryDesc": "Import custom theme packages, keep them in local storage, and reuse them from the appearance picker.",
    "themeImportButton": "Import theme",
    "themeImportHint": "Theme CSS should target html[data-theme=\"your-theme\"] and override semantic tokens.",
    "themeImported": "Imported {{name}}",
    "themeDeleted": "Theme removed",
    "themeDeleteFailed": "Failed to remove theme",
    "themeImportInvalid": "Invalid theme package",
    "themeSourceBuiltin": "Builtin",
    "themeSourceCustom": "Custom",
    "themeActive": "Active",
    "themeApply": "Apply",
    "themeSchemeLabel": "Color scheme",
    "themeScheme": {
      "light": "Light",
      "dark": "Dark"
    },
    "modelDefault": "Default Model",
    "modelFast": "Fast Model",
    "modelBalance": "Balance Model",
    "modelImage": "Image Model",
    "descDefault": "Main narrative, complex reasoning",
    "descFast": "Plugin default, lightweight judgment",
    "descBalance": "Referee plugins, complex logic",
    "descImage": "Image generation (optional)",
    "collapseCapability": "Collapse",
    "editCapability": "Edit Capabilities",
    "resetOverride": "Reset",
    "overrideApplied": "Overridden",
    "modelDatabase": "Model Database",
    "updateFromGitHub": "Update from GitHub",
    "modelCount": "{{count}} models (LiteLLM)",
    "updatedAt": "Updated: {{date}}",
    "dbUnavailable": "Database unavailable",
    "selectPreset": "Select preset",
    "noPresetFallback": "Unconfigured (falls back to Heavy)",
    "keysConfiguredDesc": "Fill in the API keys for providers configured in llm.toml. Can also be configured via .env.llm file.",
    "keysLocalDesc": "Keys are only stored in browser localStorage and are never sent to server storage.",
    "keyConfigured": "Configured",
    "keyUnconfigured": "Not configured",
    "pingTest": "Connection Test",
    "noProvidersTitle": "No providers registered yet",
    "noProvidersDesktopDesc": "Open your local llm.toml and add at least one [covel.<slot>] section, then reload this dialog.",
    "noProvidersWebDesc": "This web build reads slot definitions from the server's llm.toml. Ask your operator to configure a slot, or run a desktop build where you can edit the file locally.",
    "openLlmToml": "Open llm.toml",
    "advancedDesc": "Leave empty to use model provider defaults.",
    "selectSlot": "Select Slot",
    "hasApiKey": "Has Key",
    "noCustomPresets": "No custom presets",
    "addPreset": "Add Preset",
    "add": "Add",
    "export": "Export",
    "import": "Import",
    "namePlaceholder": "Name",
    "baseUrlPlaceholder": "Base URL (optional)",
    "inputModalities": "Input Modalities (what the model accepts)",
    "outputModalities": "Output Modalities (what the model produces)",
    "featureTags": "Feature Tags",
    "pricing": "Pricing (USD / million tokens)",
    "pricingInput": "Input",
    "pricingOutput": "Output",
    "modalInText": "Text Input",
    "modalInImage": "Image Input",
    "modalInAudio": "Audio Input",
    "modalInVideo": "Video Input",
    "modalInFile": "File Input",
    "modalOutText": "Text Output",
    "modalOutImage": "Image Generation",
    "modalOutAudio": "Speech Synthesis",
    "modalOutEmbedding": "Embedding",
    "featFunctionCalling": "Function Calling",
    "featStructuredOutput": "Structured Output",
    "featStreaming": "Streaming",
    "featReasoning": "Reasoning",
    "featVision": "Vision",
    "featPromptCaching": "Caching",
    "featWebSearch": "Web Search",
    "featComputerUse": "Computer Use",
    "title": "Settings",
    "searchPlaceholder": "Search settings...",
    "noResults": "No settings match \"{{query}}\"",
    "noGroupSelected": "No group selected.",
    "groupEmpty": "This group has no adjustable settings yet.",
    "groupGeneral": "General",
    "groupLlm": "LLM",
    "groupPlugins": "Plugins",
    "groupDesktop": "Desktop",
    "groupData": "Data",
    "llmSlots": "Slots",
    "llmKeys": "API Keys",
    "llmPresets": "Custom Presets",
    "llmAdvanced": "Advanced",
    "customWidgetUnavailable": "This setting uses a dedicated panel — edit it in the matching LLM / Plugin section.",
    "show": "Show",
    "hide": "Hide",
    "exportHeader": "Export",
    "exportDownload": "Export settings",
    "exportIncludeKeys": "Include API keys (sensitive)",
    "exported": "Exported",
    "importHeader": "Import",
    "importChoose": "Choose file...",
    "importInvalid": "Invalid settings file",
    "imported": "Imported",
    "importPreview": "Preview — pick what to import",
    "importKeysCount": "Include {{count}} API keys from the bundle",
    "importApply": "Apply ({{count}})",
    "resetHeader": "Reset",
    "resetAll": "Reset all settings",
    "resetAllConfirm": "Reset every setting to its default? This cannot be undone.",
    "reset": "Reset",
    "packages": {
      "navLabel": "Import Packages",
      "title": "Import Packages",
      "description": "Drop a .zip to install a world or plugin. New plugins require a server restart.",
      "pluginLabel": "Plugin package",
      "pluginHint": ".zip containing PLUGIN.md (or runtimes/<sub>/PLUGIN.md) + package.json",
      "worldLabel": "World package",
      "worldHint": ".zip containing world.yaml and WORLD.md",
      "chooseFile": "Choose file",
      "uploading": "Uploading…",
      "uploadFailed": "Install failed",
      "invalidFileType": "Please choose a .zip file",
      "installed": "Installed {{id}}",
      "installedRestart": "Installed {{id}} — restart required",
      "restartHint": "The new plugin was written to the user plugins directory. Restart the server/desktop app to load it.",
      "restartNow": "Restart now",
      "reloadFailed": "Reload failed"
    },
    "desktopDataLocations": "Data Locations",
    "desktopDataConfig": "Config",
    "desktopDataData": "Data",
    "desktopDataDb": "Database",
    "desktopDataLogs": "Logs",
    "desktopOpenConfig": "Open config (~/.covel)",
    "desktopOpenData": "Open data folder",
    "desktopOpenLogs": "Open logs folder",
    "desktopChangeData": "Change data location…",
    "desktopEditFiles": "Edit config files",
    "desktopEditFilesHint": "Opens in your default editor. Restart Covel after saving for changes to take effect.",
    "desktopEditLlm": "Edit llm.toml",
    "desktopEditKeys": "Edit keys.env",
    "desktopServer": "Backend Server",
    "desktopServerPort": "Local API server running on port ",
    "desktopRestart": "Restart server",
    "desktopApplyConfigChanges": "Apply config changes",
    "desktopRestartElectronOnly": "This action is only available in the Electron desktop app.",
    "desktopRestartHint": "Restart the local backend and refresh the UI: reloads plugin code / prompts / UI, llm.toml and keys.env. Click after editing those files or while iterating on a plugin. In-flight turns will disconnect.",
    "desktopRestartWebHint": "Not running in desktop — refresh your browser to reload manually.",
    "desktopRefresh": "Refresh info",
    "desktopTutorial": "Tutorial",
    "desktopResetOnboardingHint": "Re-run the onboarding wizard the next time Covel launches.",
    "desktopResetOnboarding": "Reset onboarding",
    "desktopAbout": "About",
    "desktopVersion": "Version",
    "desktopPlatform": "Platform",
    "desktopMode": "Mode",
    "desktopModeDev": "Development",
    "desktopModeProd": "Production",
    "desktopKeysNote": "API keys live in {{path}} as plain text. Protect the file with OS permissions; the app sets mode 600 when writing.",
    "presetProviderPlaceholder": "Provider (e.g. openai)",
    "presetModelPlaceholder": "Model ID (e.g. deepseek-chat)",
    "slotChainSummary": "Plugins → Slots → Presets → API keys. Change a preset to swap models; manage keys in the Keys tab.",
    "chainRuntime": "Runtime",
    "chainSlot": "Slot",
    "chainPreset": "Preset",
    "chainKey": "API key",
    "desktopLlmMissingTitle": "No LLM slots configured yet",
    "desktopLlmMissingHint": "Click below to open ~/.covel/llm.toml and add at least one [covel.<slot>] section.",
    "autoBindSlots": "Auto-bind",
    "runtimeSlotsDiscovered": "Runtime-requested slots",
    "temperature": "Temperature",
    "topP": "Top P",
    "maxOutputTokens": "Max Output Tokens",
    "numberPlaceholder": "e.g. 4096",
    "frequencyPenalty": "Frequency Penalty",
    "presencePenalty": "Presence Penalty",
    "resetToDefaults": "Reset to defaults",
    "apiKeyPlaceholder": "API Key (sk-...)",
    "required": "required",
    "default": "default",
    "runtime": "runtime",
    "frontendOverlay": "frontend overlay",
    "fallbackSlot": "fallback: {{slot}}",
    "useBaseSlotConfig": "Use base slot config",
    "builtInPresets": "Built-in",
    "customPresets": "Custom",
    "providerLabel": "Provider",
    "modelLabel": "Model",
    "presetCustom": "Preset: custom",
    "presetOverride": "Preset: override",
    "protocolLabel": "Protocol: {{protocol}}",
    "contextWindow": "Context Window",
    "contextWindowShort": "ctx",
    "maxOutputTokensShort": "out",
    "pricingInputOutputTitle": "Pricing (input/output per M tokens)",
    "pricePerImage": "Price per image",
    "contextWindowTokens": "Context Window (tokens)",
    "desktopRestartFailed": "Restart failed",
    "desktopDataDirPrompt": "Enter an absolute path for the new data directory:\n\nExamples:\n  /Users/me/Documents/covel\n  /Volumes/External/covel-data\n\nChanging this will not move existing data — the new location starts fresh.",
    "desktopDataRootSet": "Data root set to {{path}}. Restart the app to apply.",
    "desktopChangeDataRootFailed": "Could not change data root",
    "desktopOnboardingResetToast": "Onboarding will show on next launch",
    "ping": "Ping",
    "pingTooltip": "Test connectivity and latency",
    "pingTtfb": "{{ms}}ms TTFB",
    "pingErrorTooltip": "Error: {{error}}",
    "pingResolvedVia": "resolved via {{resolvedVia}}",
    "pingSlotFallbackTitle": "Slot fell through to {{resolvedVia}}; the slot you requested is not configured.",
    "pingFailed": "Failed"
  },
  "plugin": {
    "runtimes": "Runtimes",
    "tools": "Tools",
    "requires": "Requires",
    "triggerAlways": "Always",
    "triggerInterval": "Interval",
    "triggerManual": "Manual",
    "triggerEvent": "Event",
    "locked": "Core plugin — cannot be disabled",
    "core": "core",
    "enable": "Enable plugin",
    "disable": "Disable plugin",
    "emptyPlaceholder": "{{label}} has no data yet. Waiting for the story to progress…",
    "useDefault": "Use default",
    "useDefaultWith": "Use default ({{value}})",
    "modelBindingAria": "Which model slot this plugin's runtime will use. Leave at default unless you have a reason to override.",
    "modelBindingSource": "Model binding — edit in Session Prep",
    "modelBindingFallback": "Model binding: see Session Prep",
    "modelBinding": "Model",
    "modelOverrideHint": "Override active — next turn will use this model",
    "defaultSlot": "default",
    "autoSlot": "auto (system default)",
    "config": "Config",
    "loadError": "Load Error",
    "unknownError": "Unknown error",
    "slotsMissing": "Configure model slots in llm.toml to override",
    "useRuntimeDefault": "Runtime default: {{slot}}",
    "useRuntimeDefaultWith": "Runtime default: {{slot}} ({{value}})",
    "providerSlot": "provider slot",
    "providerSlotMissingTitle": "Add [covel.{{slot}}] to llm.toml, or change {{plugin}}.modelPresetId in Settings > Plugins.",
    "providerSlotMissingDetail": "Configure [covel.{{slot}}] in llm.toml, or change modelPresetId in Settings > Plugins > {{plugin}}.",
    "providerSlotSettingDetail": "from plugin setting modelPresetId; edit in Settings > Plugins > {{plugin}}",
    "slotMissingTitle": "Add [covel.{{slot}}] to llm.toml",
    "slotMissingShort": "missing [covel.{{slot}}]",
    "runtimeDefaultSummary": "runtime default · {{slot}}",
    "runtimeDefaultSummaryWithModel": "runtime default · {{slot}} · {{model}}",
    "runtimeDefaultMissing": "runtime default · {{slot}} (missing)",
    "invalidPanelSpec": "Invalid panel spec",
    "source": {
      "builtin": {
        "label": "Core",
        "tooltip": "Builtin core plugin shipped with Covel"
      },
      "official": {
        "label": "Official",
        "tooltip": "Official plugin curated by Covel"
      },
      "community": {
        "label": "Third-party",
        "tooltip": "Third-party plugin installed under ~/.covel/plugins"
      }
    },
    "approval": {
      "title": "Authorize plugin action",
      "confirmMessage": "Plugin {{pluginId}} requests permission to run {{action}}. Authorize all matching calls for this session?",
      "allow": "Authorize",
      "deny": "Deny",
      "denied": "Denied {{action}}",
      "submitFailed": "Approval submission failed: {{error}}",
      "unexpectedRequired": "Still got approval-required after grant — please check the approval backend"
    },
    "invokeRuntime": {
      "submitted": "Submitted {{count}} background job(s): {{ids}}. Waiting for completion…",
      "noFollowerEvents": "{{runtimeId}} finished but emitted no background follower (missing matching events[]). Check that the model output a valid JSON envelope.",
      "failedJobs": "{{count}} background job(s) failed. Check the job panel for details."
    },
    "jobs": {
      "imagePromptGenerating": "Generating image prompt...",
      "imagePromptQueued": "Image prompt generated; image job queued."
    },
    "runtimeErrors": {
      "title": "Recent plugin error",
      "dismiss": "Dismiss plugin error"
    }
  },
  "pluginJob": {
    "completed": "{{target}} completed in {{duration}}",
    "failed": "{{target}} failed: {{error}}",
    "unknownError": "unknown error"
  },
  "coreImage": {
    "generateButton": "Generate Illustration",
    "panel": {
      "noImagesYet": "No images generated yet.",
      "galleryHint": "Latest first. Find prompts on the Jobs tab.",
      "viewLarge": "View larger",
      "noJobs": "No image jobs in progress.",
      "jobsHint": "Prompt and job status. Click a job ID to expand.",
      "promptHeader": "Prompt",
      "promptCopied": "Prompt copied",
      "copy": "Copy",
      "linkedImages": "Images for this prompt · {{count}}",
      "rerunWithPrompt": "Re-run this prompt (keep originals)",
      "rerunSubmitted": "Submitted re-run job: {{id}}",
      "rerunSubmittedSimple": "Submitted re-run job",
      "viewLargeAction": "Open",
      "download": "Download",
      "downloadImage": "Download image",
      "rerun": "Re-run",
      "authorizeConfirm": "Authorize {{runtimeId}} for this session?"
    },
    "settings": {
      "title": "Image Generation Settings",
      "style": "Art Style",
      "multiPanel": "Multi-panel",
      "includeText": "Include Text",
      "promptLanguage": "Prompt Language"
    },
    "style": {
      "cinematic": "Cinematic",
      "anime": "Anime",
      "oil-painting": "Oil Painting",
      "watercolor": "Watercolor",
      "pixel-art": "Pixel Art",
      "photoreal": "Photorealistic"
    },
    "promptLang": {
      "auto": "Auto (follow locale)",
      "zh": "Chinese (recommended for DashScope)",
      "en": "English (recommended for GPT/Gemini)"
    },
    "generationFailed": "Image generation failed"
  },
  "onboarding": {
    "welcome": "Welcome to Covel",
    "tagline": "AI-driven RPG engine. Craft interactive stories powered by large language models.",
    "language": "Language",
    "getStarted": "Get Started",
    "configureProvider": "Configure AI Provider",
    "providerDesc": "Covel needs an LLM API key to generate stories. Pick a provider and paste your key.",
    "selectProvider": "Provider",
    "customProvider": "Custom (OpenAI Compatible)",
    "providerName": "Provider Name",
    "modelId": "Model ID",
    "modelIdHint": "Pick one of the detected models or type a model ID directly.",
    "apiKey": "API Key",
    "testConnection": "Test Connection",
    "narratorModel": "Narrator Model",
    "narratorModelDesc": "The core model that drives the main story. Pick a provider and paste your key.",
    "pluginModel": "Plugin Model",
    "pluginModelDesc": "Plugins (character tracker, world generator, codex, …) can share the narrator model or use a cheaper one.",
    "pluginSame": "Use same as narrator",
    "pluginDifferent": "Use a different model",
    "pluginDifferentHint": "Route plugins to a faster/cheaper provider.",
    "skip": "Skip for now",
    "skipTitle": "You can configure this later in Settings.",
    "disabledHint": "Fill in API Key and Model ID to continue, or skip below to configure later.",
    "localeZh": "Switch to Chinese",
    "localeEn": "Switch to English",
    "back": "Back",
    "continue": "Continue",
    "ready": "You're all set",
    "readyDesc": "Select a world, then start your adventure. You can adjust settings anytime from the top bar.",
    "step1Label": "Pick a world",
    "step1Desc": "Choose from built-in worlds or create your own.",
    "step2Label": "Start your adventure",
    "step2Desc": "The AI narrator will build a story around you.",
    "enter": "Enter Covel",
    "baseUrl": "Base URL"
  },
  "character": {
    "noCharacters": "Characters will appear here once created.",
    "noAttributes": "No attribute data",
    "defaultName": "Character {{index}}",
    "categories": {
      "stats": "Stats",
      "bio": "Bio",
      "abilities": "Abilities",
      "equipment": "Equipment",
      "social": "Social",
      "custom": "Other"
    },
    "type": {
      "player": "Player",
      "npc": "NPC",
      "companion": "Companion",
      "ally": "Ally",
      "enemy": "Enemy"
    }
  },
  "lorebook": {
    "title": "Lorebook",
    "refresh": "Refresh",
    "deleteConfirm": "Delete entry \"{{id}}\"? This cannot be undone.",
    "noEntries": "No session lorebook entries yet",
    "enable": "Enable",
    "disable": "Disable",
    "delete": "Delete",
    "expand": "Expand",
    "collapse": "Collapse"
  },
  "graph": {
    "empty": "Graph is currently empty — waiting for NPCs to appear.",
    "clearSelection": "Clear selection",
    "loading": "Loading graph…",
    "stats": "{{nodes}} nodes · {{links}} relations"
  },
  "form": {
    "defaultTitle": "Form",
    "submit": "Submit",
    "submitted": "Submitted",
    "submittedHint": "Selected",
    "selectPrefix": "Select {{label}}",
    "selectPlaceholder": "Select..."
  },
  "interaction": {
    "playerSelected": "You chose:",
    "playerLabel": "You"
  },
  "toast": {
    "copy": "Copy detail",
    "dismiss": "Dismiss",
    "errorTitle": "Something went wrong",
    "networkError": "Network error — check your connection",
    "bootFailed": "Failed to initialise session",
    "sendMessageFailed": "Failed to send message"
  },
  "error": {
    "plugin": {
      "loadFailed": "Plugin load failed"
    },
    "boundary": {
      "messageRenderingError": "Message rendering error",
      "copyError": "Copy error",
      "unexpectedError": "Unexpected error",
      "appTitle": "Something broke while rendering this view.",
      "appDescription": "Try the actions below. If the problem persists, copy the error and open an issue.",
      "tryAgain": "Try again",
      "reloadApp": "Reload app"
    }
  },
  "common": {
    "loading": "Loading...",
    "error": "Something went wrong",
    "save": "Save",
    "cancel": "Cancel",
    "confirm": "Confirm",
    "close": "Close",
    "delete": "Delete",
    "deleting": "Deleting...",
    "edit": "Edit",
    "create": "Create",
    "search": "Search",
    "execute": "Execute",
    "newSession": "New Session",
    "refresh": "Refresh",
    "expand": "Expand",
    "collapse": "Collapse",
    "enable": "Enable",
    "disable": "Disable",
    "confirmDelete": "Confirm delete",
    "noData": "No data",
    "noMatch": "No matching entries",
    "yes": "Yes",
    "no": "No",
    "toggleTheme": "Toggle theme",
    "copy": "Copy",
    "new": "new",
    "newUpper": "NEW",
    "retry": "Retry"
  },
  "debugger": {
    "title": "Trace Inspector",
    "toSession": "Session",
    "live": "LIVE",
    "auto": "Auto",
    "refresh": "Refresh",
    "sessions": "Sessions",
    "noSessions": "No sessions found",
    "traces": "Traces",
    "sessionData": "Session Data",
    "all": "All",
    "selectSessionToInspect": "Select a session to inspect traces",
    "noTraceEvents": "No trace events recorded",
    "eventsWillAppear": "Events will appear here as turns execute",
    "turn": "Turn {{count}}",
    "turn_one": "Turn {{count}}",
    "pluginInvocation": "Plugin invocation",
    "nRuntimes": "{{count}} runtimes",
    "nRuntimes_one": "{{count}} runtime",
    "error": "ERROR",
    "running": "RUNNING",
    "runtimes": "Runtimes",
    "flowEvents": "Flow Events",
    "noEventsMatchingFilter": "No events matching filter",
    "selectSession": "Select a session",
    "loadingSessionData": "Loading session data...",
    "dataSection": {
      "session": "Session",
      "characters": "Characters",
      "messages": "Messages",
      "gameState": "Game State",
      "executionSteps": "Execution Steps",
      "frameworkCapabilities": "Framework Capabilities",
      "pluginContracts": "Plugin Contracts",
      "pluginDataIndex": "Plugin Data Index"
    },
    "noCharactersCreated": "No characters created",
    "noMessages": "No messages",
    "noStateData": "No state data",
    "noExecutionTraces": "No execution traces",
    "noFrameworkCapabilities": "No framework capabilities snapshot",
    "noPluginContracts": "No plugin contracts",
    "noPluginDataIndex": "No plugin data index",
    "eventDetail": "Event Detail",
    "close": "Close",
    "promptMessages": "Prompt Messages ({{count}})",
    "inputTokens": "Input",
    "outputTokens": "Output",
    "responseText": "Response Text",
    "toolCalls": "Tool Calls ({{count}})",
    "toolResult": "Tool Result",
    "toolInput": "Tool Input",
    "blockType": "Block",
    "rawPayload": "Raw Payload",
    "category": {
      "flow": "Flow",
      "runtime": "Runtime",
      "llm": "LLM",
      "tool": "Tool",
      "message": "Message",
      "block": "Block",
      "state": "State"
    },
    "view": "View",
    "session": "Session",
    "tokenCount": "{{count}} tokens",
    "discovery": {
      "manifest": "manifest",
      "triggers": "{{count}} triggers",
      "outputs": "{{count}} outputs",
      "noSlots": "no slots",
      "writes": "{{count}} writes",
      "reads": "{{count}} reads",
      "sources": "{{count}} sources",
      "mergeModes": "{{count}} merge modes",
      "targets": "{{count}} targets",
      "runtimeCount": "{{count}} runtime",
      "capabilities": "capabilities",
      "tools": "tools",
      "extension": "extension",
      "rpc": "{{count}} rpc",
      "ui": "{{count}} ui",
      "schemas": "{{count}} schemas",
      "namespaces": "{{count}} namespaces",
      "keys": "{{count}} keys",
      "empty": "empty"
    }
  },
  "reload": {
    "reloading": "Restarting server…",
    "reloadingServer": "Restarting backend…",
    "reloadingHint": "Usually takes a few seconds."
  },
  "media": {
    "audio": "audio",
    "audioUnavailable": "audio unavailable",
    "audioUnavailableAria": "{{label}} unavailable",
    "play": "Play",
    "pause": "Pause",
    "seek": "Seek",
    "playbackSpeed": "Playback speed",
    "downloadAudio": "Download audio"
  },
  "branchReply": {
    "replyCandidates": "Reply candidates",
    "draft": "Draft",
    "send": "Send",
    "accept": "Accept",
    "regenerate": "Regenerate",
    "jobSubmitted": "Submitted branch-reply job: {{jobId}}",
    "approvalRequired": "Branch reply action requires approval.",
    "actionFailed": "Branch reply action failed"
  }
}
