import type { TranslationKey } from "./zh-CN";

const en: Record<TranslationKey, string> = {
  // ── Top Bar ──────────────────────────────────────────────
  "topBar.openUserMenu": "Open user menu",
  "topBar.openMenu": "Open menu",
  "topBar.theme": "Theme",
  "topBar.language": "Language",
  "topBar.checkUpdates": "Check for updates",
  "topBar.moreSettings": "More settings",
  "topBar.logout": "Log out",
  "topBar.collapseSidebar": "Collapse sidebar",
  "topBar.expandSidebar": "Expand sidebar",
  "topBar.collapseTerminal": "Collapse terminal panel",
  "topBar.expandTerminal": "Expand terminal panel",
  "topBar.collapseDrawer": "Collapse right panel",
  "topBar.expandDrawer": "Expand right panel",
  "topBar.minimize": "Minimize",
  "topBar.maximize": "Maximize",
  "topBar.restore": "Restore",
  "topBar.close": "Close",

  // ── Theme Options ────────────────────────────────────────
  "theme.system": "System",
  "theme.light": "Light",
  "theme.dark": "Dark",

  // ── Thread Status ────────────────────────────────────────
  "threadStatus.running": "Running",
  "threadStatus.completed": "Completed",
  "threadStatus.needsReply": "Needs reply",
  "threadStatus.failed": "Failed",
  "threadStatus.interrupted": "Interrupted",

  // ── Time Labels ──────────────────────────────────────────
  "time.justNow": "Just now",
  "time.minutesAgo": "{{count}}m ago",
  "time.today": "Today",
  "time.yesterday": "Yesterday",
  "time.daysAgo": "{{count}}d ago",
  "time.lastWeek": "Last week",

  // ── Dashboard ────────────────────────────────────────────
  "dashboard.newThread": "New thread",
  "dashboard.moreActions": "More actions",
  "dashboard.deletingThread": "Deleting thread",
  "dashboard.confirmDeleteThread": "Confirm delete thread",
  "dashboard.deleteThread": "Delete thread",
  "dashboard.fileTree": "File tree",
  "dashboard.fileTreePanel": "File tree · Project Panel",
  "dashboard.sourceControl": "Source control",
  "dashboard.sourceControlPanel": "Source control · Git Panel",
  "dashboard.terminalDisabledHint": "Select a workspace to open Terminal",
  "dashboard.upToDate": "Already up to date v{{version}}",

  // ── Dashboard Errors ─────────────────────────────────────
  "dashboard.error.refreshThreadList": "Failed to refresh thread list",
  "dashboard.error.workspaceInit": "Workspace initialization failed",
  "dashboard.error.refreshWorkspaceList": "Failed to refresh workspace list",
  "dashboard.error.addWorkspace": "Failed to add workspace",
  "dashboard.error.updateDefaultWorkspace": "Failed to update default workspace",
  "dashboard.error.loadMoreThreads": "Failed to load more threads",
  "dashboard.error.deleteThread": "Failed to delete thread",
  "dashboard.error.createThread": "Failed to create thread",
"dashboard.error.switchProfile": "Failed to switch agent profile",

  // ── Composer ─────────────────────────────────────────────
  "composer.removeAttachment": "Remove attachment {{name}}",
  "composer.attachmentCount": "{{count}} attachments",
  "composer.unnamedAttachment": "Unnamed attachment",
  "composer.attachmentFallback": "Attachment {{index}}",
  "composer.fileReferenceCount": "{{count}} file references",
  "composer.removeFileReference": "Remove file reference {{path}}",
  "composer.uploadFileOrImage": "Upload file or image",
  "composer.noProfileAvailable": "No available profile found.",
  "composer.agentProfilesTitle": "Agent Profiles",
  "composer.profileSelectLabel": "Switch the active profile",
  "composer.activeProfileLabel": "Active Profile",
  "composer.editProfiles": "Edit profiles in Settings",
  "composer.profileDetailsTitle": "Profile details",
  "composer.profileQuickEditFailed": "Failed to update profile.",
  "composer.profileThinkingLevel": "Thinking level",
  "composer.profileAgentTeam": "Agent Team",
  "composer.profileAgentTeamDesc": "Agents this profile can delegate to.",
  "composer.profileAgentTeamBuiltIn": "Built-in agents",
  "composer.profileAgentTeamCustom": "Custom agents",
  "composer.profileAgentTeamLoading": "Loading profile access…",
  "composer.profileAgentTeamEmpty": "No custom agents are allowed for this profile.",
  "composer.profileAgentTeamUnavailable": "Custom agent access is unavailable in this runtime.",
  "composer.profileResponseStyle": "Style",
  "composer.profileResponseLanguage": "Language",
  "composer.responseStyle.balanced": "Balanced",
  "composer.responseStyle.concise": "Concise",
  "composer.responseStyle.guide": "Guided",
  "composer.profileDeleted": "Profile deleted",
  "composer.profileDeletedHint": "This thread references a deleted profile. Choose another profile to continue.",
  "composer.profileTier.primary": "Primary",
  "composer.profileTier.auxiliary": "Auxiliary",
  "composer.profileTier.lightweight": "Lightweight",
  "composer.profileTier.notConfigured": "Not configured",
  "composer.fileSearchError": "File search failed, please try again later.",
  "composer.noWorkspaceBound": "No workspace bound. Cannot search files.",
  "composer.typeFileNameHint": "Type a file name or path to search.",
  "composer.searchingFiles": "Searching files…",
  "composer.noMatchingFiles": "No matching files found.",
  "composer.typeSkillHint": "Type a skill name, tag, or trigger to search enabled skills.",
  "composer.noMatchingSkills": "No matching enabled skills found.",
  "composer.queueMode.ariaLabel": "Queue new input mode",
  "composer.queueMode.tooltip": "Choose how this input is queued for the running thread",
  "composer.queueMode.panelTitle": "Select message type for appending messages",
  "composer.queueMode.steer": "Steer",
  "composer.queueMode.followUp": "Queue",
  "composer.queueMode.steerLabel": "Steer",
  "composer.queueMode.steerDesc": "Insert a message during the current session to steer the conversation direction.",
  "composer.queueMode.followUpLabel": "Queue",
  "composer.queueMode.followUpDesc": "Send a message after the current session completes to start a new round.",

  // ── Runtime Queue ────────────────────────────────────────
  "queue.title": "Runtime Queue",
  "queue.steer": "Steer",
  "queue.followUp": "Queue",
  "queue.status.pending": "Pending",
  "queue.status.consumed": "Consumed",
  "queue.status.cleared": "Cleared",
  "queue.status.cancelled": "Cancelled",
  "queue.cancelMessage": "Cancel queued message",
  "queue.cancellingMessage": "Cancelling queued message",
  "queue.promoteMessage": "Promote to steer",
  "queue.promotingMessage": "Promoting to steer",
  "queue.editMessage": "Edit queued message",
  "queue.editingMessage": "Editing queued message",
  "queue.pendingCount": "{{count}} pending",
  "queue.deferringSteer": "deferring steer",
  "queue.steeringQueued": "Steering · {{count}} queued",
  "queue.followUpQueued": "Queue · {{count}} queued",
  "queue.waitingApprovalError": "This thread is waiting for approval before it can accept queued instructions.",

  // ── Runtime Thread Surface (Plan Approval) ───────────────
  "plan.implementAsPlan": "Implement as planned",
  "plan.clearAndImplement": "Clear context and implement",
  "plan.approvedClearAndImplement": "Approved: Clear context and implement",
  "plan.approvedImplement": "Approved: Implement as planned",
  "plan.approvedToImplement": "Approved to implement",
  "plan.superseded": "This plan has been superseded by a newer version.",
  "plan.awaitingApproval": "Awaiting implementation approval",

  // ── Tool UI ─────────────────────────────────────────────
  "tool.status.awaitingApproval": "Awaiting Approval",
  "tool.status.responded": "Responded",
  "tool.status.running": "Running",
  "tool.status.pending": "Pending",
  "tool.status.completed": "Completed",
  "tool.status.denied": "Denied",
  "tool.status.error": "Error",
  "tool.label.parameters": "Parameters",
  "tool.label.result": "Result",
  "tool.label.error": "Error",
  "tool.label.input": "Input",
  "tool.label.output": "Output",
  "tool.action.approve": "Approve",
  "tool.action.reject": "Reject",
  "tool.approval.request": "This tool requires approval before continuing the run.",
  "tool.approval.granted": "Approval granted. Execution resumed.",
  "tool.approval.denied": "Approval denied.",
  "tool.tag.approval": "Approval",
  "tool.tag.approved": "Approved",
  "tool.tag.denied": "Denied",
  "tool.runtimeStatus.approval": "approval",
  "tool.runtimeStatus.approved": "approved",
  "tool.runtimeStatus.reply": "reply",
  "tool.runtimeStatus.running": "running",
  "tool.runtimeStatus.pending": "pending",
  "tool.runtimeStatus.done": "done",
  "tool.runtimeStatus.denied": "denied",
  "tool.runtimeStatus.error": "error",
  "tool.discarded.title": "Discarded",
  "tool.discarded.description": "This partial response was dropped from model history after the stream ended before protocol completion.",

  // ── Terminal ─────────────────────────────────────────────
  "terminal.noThread": "No thread selected",
  "terminal.restartTerminal": "Restart terminal",
  "terminal.closeTerminal": "Close terminal",
  "terminal.collapseTerminal": "Collapse terminal",
  "terminal.sendFirstMessageHint": "Send a message first to open Terminal",
  "terminal.noAttachableThread": "No attachable thread available.",
  "terminal.connecting": "Terminal connecting…",
  "terminal.onlyTauri": "Terminal is only available in Tauri desktop environment.",
  "terminal.connectionFailed": "Terminal connection failed.",
  "terminal.resizeFailed": "Terminal resize sync failed.",

  // ── Project Panel ────────────────────────────────────────
  "projectPanel.error.readFileTree": "Failed to read file tree",
  "projectPanel.error.filterFiles": "Failed to filter files",
  "projectPanel.error.readDirectory": "Failed to read directory contents",
  "projectPanel.error.loadMoreDirectory": "Failed to load more directory contents",
  "projectPanel.error.expandFilterPath": "Failed to expand filter result path",

  // ── Source Control ───────────────────────────────────────
  "sourceControl.generateCommitMessage": "AI generate commit message",
  "sourceControl.requestFailed": "Request failed",
  "sourceControl.commitEmpty": "Commit message cannot be empty",
  "sourceControl.noStagedChanges": "There are no staged changes to commit",
  "sourceControl.statusAdded": "Added",
  "sourceControl.statusDeleted": "Deleted",
  "sourceControl.statusRenamed": "Renamed",
  "sourceControl.statusTypeChanged": "Type changed",
  "sourceControl.statusConflict": "Conflict",
  "sourceControl.statusModified": "Modified",
  "sourceControl.actionCommit": "Commit",
  "sourceControl.actionFetch": "Fetch",
  "sourceControl.actionPull": "Pull",
  "sourceControl.actionPush": "Push",
  "sourceControl.unstageAll": "Unstage all",
  "sourceControl.stageAll": "Stage all",
  "sourceControl.unstage": "Unstage",
  "sourceControl.stage": "Stage",
  "sourceControl.failedLoadGit": "Failed to load Git state",
  "sourceControl.failedSubscribeGit": "Failed to subscribe to Git updates",
  "sourceControl.noBranch": "No branch",
  "sourceControl.failedRefreshSnapshot": "Failed to refresh Git snapshot",
  "sourceControl.gitActionFailed": "Git action failed",
  "sourceControl.failedGenerateCommitMsg": "Failed to generate commit message",
  "sourceControl.commitFailed": "Commit failed",
  "sourceControl.drawerUnavailable": "Git drawer is unavailable",
  "sourceControl.selectWorkspaceFirst": "Select a workspace first",
  "sourceControl.preparingGitContext": "Preparing Git context",
  "sourceControl.failedLoadGitState": "Failed to load Git state",
  "sourceControl.notGitRepo": "This workspace is not a Git repository",
  "sourceControl.commitMsgPlaceholder": "Write a commit message for the staged changes",
  "sourceControl.installGitHint": "Install Git CLI to enable commit, fetch, pull, and push",
  "sourceControl.commitMsgLabel": "Commit Message",
  "sourceControl.confirmAction": "Confirm {{action}}",
  "sourceControl.confirmActionDefault": "Confirm action",
  "sourceControl.mockModeUnavailable": "Commit message generation is unavailable in mock mode",
  "sourceControl.workspaceRequired": "A workspace is required",
  "sourceControl.selectModelFirst": "Select an enabled lite, assistant, or primary model in the current profile first",
  "sourceControl.noChangesToSummarize": "No changes available to summarize",
  "sourceControl.generatingCommitMsg": "Generating commit message",
  "sourceControl.generateFromProfile": "Generate a commit message from the current profile",
  "sourceControl.commitLabel": "Commit",
  "sourceControl.gitCliRequired": "Git CLI is required",
  "sourceControl.stageChangesFirst": "Stage changes before committing",
  "sourceControl.writeCommitMsgFirst": "Write a commit message first",
  "sourceControl.commitInProgress": "Commit in progress",
  "sourceControl.commitStagedChanges": "Commit staged changes",
  "sourceControl.refreshSnapshot": "Refresh Git snapshot",
  "sourceControl.staged": "Staged",
  "sourceControl.tracked": "Tracked",
  "sourceControl.untracked": "Untracked",
  "sourceControl.conflicts": "Conflicts",
  "sourceControl.failedLoadFileDiff": "Failed to load file diff",
  "sourceControl.discardChanges": "Discard Changes",
  "sourceControl.deleteFile": "Delete File",
  "sourceControl.discardTrackedTitle": "Discard Tracked Changes",
  "sourceControl.discardTrackedDescription": "This will revert the file to its last committed version. This action cannot be undone.",
  "sourceControl.discardUntrackedTitle": "Delete Untracked File",
  "sourceControl.discardUntrackedDescription": "This will permanently delete the file from disk. This action cannot be undone.",
  "sourceControl.discardButton": "Discard Changes",
  "sourceControl.deleteButton": "Delete File",
  "sourceControl.discardFailed": "Failed to discard changes",

  // ── Branch Selector ────────────────────────────────────────
  "sourceControl.branch.search": "Search branches...",
  "sourceControl.branch.localBranches": "Local",
  "sourceControl.branch.remoteBranches": "Remote",
  "sourceControl.branch.createBranch": "Create branch",
  "sourceControl.branch.smartCreate": "Create branch",
  "sourceControl.branch.newBranchName": "New branch name",
  "sourceControl.branch.create": "Create",
  "sourceControl.branch.cancel": "Cancel",
  "sourceControl.branch.confirm": "Confirm",
  "sourceControl.branch.detachedHead": "Detached HEAD",
  "sourceControl.branch.loading": "Loading branches...",
  "sourceControl.branch.checkoutFailed": "Failed to switch branch",
  "sourceControl.branch.createFailed": "Failed to create branch",
  "sourceControl.branch.noResults": "No matching branches",

  // ── Workspace Apps ───────────────────────────────────────
  "workspaceApps.error.readApps": "Failed to read available apps",

  // ── System Info ──────────────────────────────────────────
  "systemInfo.error.readRuntime": "Failed to read runtime info",

  // ── Sidebar ────────────────────────────────────────────────
  "sidebar.newThread": "New thread",
  "sidebar.extensions": "Extensions",
  "sidebar.workspace": "WORKSPACE",
  "sidebar.addWorkspace": "Add workspace",
  "sidebar.newThreadForWorkspace": "New Thread",
  "sidebar.openInFileManager": "Open in file manager",
  "sidebar.remove": "Remove",
  "sidebar.showMore": "Show more",
  "sidebar.delete": "Delete",
  "sidebar.deleting": "Deleting",
  "sidebar.regenerateTitle": "AI Generate",
  "sidebar.regenerateTitleFailed": "Failed to generate title",
"sidebar.renameThread": "Rename thread",
  "sidebar.noLiteModel": "Configure a lightweight model first",

  // ── New Thread Empty State ─────────────────────────────────
  "newThread.headline": "Whenever you need, Tiy is here.",
  "newThread.description": "Start chatting right away, or pick a local workspace first.",
  "newThread.chooseProject": "Choose project",
  "newThread.selectFolderHint": "Pick a folder as a workspace, or start without one",
  "newThread.recentProjects": "Recent projects",
  "newThread.current": "Current",
  "newThread.chooseNewFolder": "Choose new folder",
  "newThread.browseHint": "Browse a local workspace that is not in the recent list",
  "newThread.chooseFolderTitle": "Choose project folder",

  // ── Composer Placeholder ───────────────────────────────────
  "composer.placeholder": "Ask Tiy anything, @ to add files, / for commands, $ for skills",

  // ── Settings: Navigation ───────────────────────────────────
  "settings.backToApp": "Back to app",
  "settings.category.account": "Account",
  "settings.category.accountDesc": "Manage your local session, account identity, active plan, and available subscription tiers.",
  "settings.category.general": "General",
  "settings.category.generalDesc": "Set app-level preferences such as theme, language, startup behavior, and composer defaults.",
  "settings.category.profiles": "Profiles",
  "settings.category.profilesDesc": "Manage agent profiles, switch the active profile, route model tiers, and tune profile-level instructions.",
  "settings.category.providers": "Providers",
  "settings.category.providersDesc": "Configure model providers, API access, request settings, and the models available to your agent.",
  "settings.category.commands": "Commands",
  "settings.category.commandsDesc": "Create reusable prompt shortcuts that appear when typing / in chat.",
  "settings.category.terminal": "Terminal",
  "settings.category.terminalDesc": "Configure the embedded terminal shell, appearance, and behavior settings.",
  "settings.category.permissions": "Permissions",
  "settings.category.permissionsDesc": "Control approval mode, allow and deny rules, sandbox access, network access, and writable paths.",
  "settings.category.agents": "Agents",
  "settings.category.agentsDesc": "Create and manage custom sub-agents.",
  "settings.category.workspace": "Workspace",
  "settings.category.workspaceDesc": "Manage project directories and choose which workspace new conversations should start in.",
  "settings.category.about": "About",
  "settings.category.aboutDesc": "View product details, jump to key project links, and check whether this desktop build is up to date.",
  "settings.category.gateway": "Channels",
  "settings.category.gatewayDesc": "Connect to WeChat or WeCom messaging channels to interact with TiyCode via IM.",
  "settings.gateway.platform": "Platform",
  "settings.gateway.platformDesc": "Select the messaging platform to connect.",
  "settings.gateway.status": "Gateway Status",
  "settings.gateway.weixin": "WeChat",
  "settings.gateway.wecom": "WeCom",
  "settings.gateway.weixinLogin": "WeChat Login",
  "settings.gateway.weixinLoginDesc": "Scan QR code with WeChat to authenticate.",
  "settings.gateway.scanQr": "Get QR Code",
  "settings.gateway.logout": "Logout",
  "settings.gateway.loggedIn": "Logged in",
  "settings.gateway.notLoggedIn": "Not logged in",
  "settings.gateway.sessionExpired": "Session expired",
  "settings.gateway.sessionExpiredDesc": "WeChat session has expired. Please scan the QR code to log in again.",
  "settings.gateway.reLogin": "Re-login",
  "settings.gateway.wecomBotId": "Bot ID",
  "settings.gateway.wecomSecret": "Secret",
  "settings.gateway.wecomWsUrl": "WebSocket URL",
  "settings.gateway.start": "Start",
  "settings.gateway.stop": "Stop",
  "settings.gateway.restart": "Restart",
  "settings.gateway.running": "Running",
  "settings.gateway.stopped": "Stopped",
  "settings.gateway.save": "Save",
  "settings.gateway.notRunning": "Gateway process is not running.",
  "settings.gateway.qrExpired": "QR code expired or login failed. Please try again.",
  "settings.gateway.scanning": "Waiting for scan…",
  "settings.gateway.wecomDesc": "WebSocket connection to WeCom AI Bot platform.",
  "settings.gateway.wecomBotIdDesc": "The Bot ID from WeCom AI Bot platform.",
  "settings.gateway.enterBotId": "Enter Bot ID",
  "settings.gateway.enterBotSecret": "Enter the Bot Secret.",
  "settings.gateway.saving": "Saving…",
  "settings.gateway.loading": "Loading…",
  "settings.gateway.saveFailed": "Save failed",
  "settings.gateway.qrLoginFailed": "QR login failed",

  // Shared gateway secrets/policies
  "settings.gateway.secretConfigured": "Secret is configured. Leave empty to keep unchanged.",
  "settings.gateway.enterSecret": "Enter Secret",
  "settings.gateway.enterAccessToken": "Enter Access Token",
  "settings.gateway.enterAppSecret": "Enter App Secret",
  "settings.gateway.enterVerifyToken": "Enter Verify Token",
  "settings.gateway.policyOpen": "Open",
  "settings.gateway.policyAllowlist": "Allowlist",
  "settings.gateway.policyBlacklist": "Blacklist",
  "settings.gateway.policyDisabled": "Disabled",

  // ── Settings: Account Panel ────────────────────────────────
  "settings.account.guest": "Guest",
  "settings.account.signInHint": "Sign in to sync your account identity and plan usage.",
  "settings.account.signOut": "Sign out",
  "settings.account.signIn": "Sign in",
  "settings.account.nextReset": "Next Reset",
  "settings.account.creditsRemaining": "credits remaining in the current cycle.",
  "settings.account.currentBadge": "Current",
  "settings.account.trialBadge": "Trial",
  "settings.account.timeHeader": "Time",
  "settings.account.amountHeader": "Amount",
  "settings.account.paymentMethodHeader": "Payment Method",
  "settings.account.invoiceHeader": "Invoice",
  "settings.account.currentPlan": "Current Plan",
  "settings.account.guestAccess": "Guest access",
  "settings.account.signInForPlan": "Sign in to see your current plan, credit usage, and the exact reset time for the next billing cycle.",
  "settings.account.planComparison": "Plan Comparison",
  "settings.account.billingHistory": "Billing History",
  "settings.account.billingAfterSignIn": "Billing records are available after sign-in",
  "settings.account.signInForBilling": "Sign in to review charge history, payment methods, and invoice references for your account.",

  // ── Settings: General Panel ────────────────────────────────
  "settings.general.newProfile": "New Profile",
  "settings.general.preferences": "Preferences",
  "settings.general.cliLabel": "CLI in PATH",
  "settings.general.cliDesc": "Register the `tiycode` command so you can run the ACP (Agent Communication Protocol) server from any terminal via `tiycode acp --stdio`.",
  "settings.general.acpServerTitle": "ACP Server",
  "settings.general.acpServerCliLabel": "CLI in PATH",
  "settings.general.acpServerCliDesc": "Register the `tiycode` command to launch the ACP server from any terminal. Usage: `tiycode acp --stdio` (stdio transport) or `tiycode acp --http <addr>` (HTTP transport).",
  "settings.general.cliInstall": "Install",
  "settings.general.cliUninstall": "Uninstall",
  "settings.general.themeLabel": "Theme",
  "settings.general.themeDesc": "Use the system appearance or lock the app to light or dark mode.",
  "settings.general.languageLabel": "Language",
  "settings.general.languageDesc": "Choose which language the app interface should use.",
  "settings.general.startupLabel": "Startup",
  "settings.general.startupDesc": "Automatically launch the app when you log in.",
  "settings.general.preventSleepLabel": "Prevent sleep while running",
  "settings.general.preventSleepDesc": "Keep the system awake while an agent run is active.",
  "settings.general.closeToTrayLabel": "Close to tray",
  "settings.general.closeToTrayDesc": "Minimize to system tray instead of quitting when the window is closed.",
  "settings.general.defaultAppendKindLabel": "Default append message type",
  "settings.general.defaultAppendKindDesc": "Choose whether appended composer input defaults to Steer or Queue.",
  "settings.general.webSearchTitle": "Web Search",
  "settings.general.webSearchEnabledLabel": "Enable Web Search",
  "settings.general.webSearchEnabledDesc": "When enabled, the main agent gets the built-in web_search tool by default; custom agents still follow their own allowed tools.",
  "settings.general.webSearchEngineLabel": "Search engine",
  "settings.general.webSearchEngineDesc": "Choose which search API the app calls. Models only see one unified web_search tool.",
  "settings.general.webSearchBaseUrlLabel": "Custom Base URL",
  "settings.general.webSearchBaseUrlDesc": "Leave empty to use the official default API endpoint for the selected engine.",
  "settings.general.webSearchBaseUrlPlaceholder": "Use default endpoint",
  "settings.general.optionalBadge": "Optional",
  "settings.general.webSearchApiKeyLabel": "API Key",
  "settings.general.webSearchApiKeyDesc": "Enter the API key for the selected search engine. Keys are saved per engine.",
  "settings.general.webSearchApiKeyConfiguredDesc": "An API key is saved for the selected search engine. Enter and save a new key to replace it.",
  "settings.general.webSearchApiKeyPlaceholder": "Enter API key",
  "settings.general.webSearchApiKeySave": "Save",
  "settings.general.webSearchApiKeyClear": "Clear saved key",
  "settings.general.webSearchApiKeySaveError": "Failed to save Web Search API key",
  "settings.general.webSearchMaxResultsLabel": "Default result count",
  "settings.general.webSearchMaxResultsDesc": "Limit how many results are returned to the model per search, from 1 to 20.",
  "settings.general.webSearchRawContentLabel": "Include page content",
  "settings.general.webSearchRawContentDesc": "Return page content or longer snippets when the search API supports it. This may increase latency and context usage.",
  "settings.general.agentProfiles": "Agent Profiles",
  "settings.general.addProfile": "Add Profile",
  "settings.general.responseStyle": "Response style",
  "settings.general.responseLanguage": "Response language",
  "settings.general.responseLanguageDesc": "The language used for agent responses.",
  "settings.general.commitLanguage": "Commit message language",
  "settings.general.commitLanguageDesc": "The language used when the Git panel generates commit messages.",
  "settings.general.primaryModel": "Primary model",
  "settings.general.primaryModelDesc": "Handles the main task flow, deep reasoning, and the Plan Agent.",
  "settings.general.thinkingLevel": "Thinking level",
  "settings.general.thinkingLevelDesc": "Controls reasoning depth for the primary model. Higher levels use more tokens.",
  "settings.general.auxiliaryModel": "Auxiliary model",
  "settings.general.auxiliaryModelDesc": "Supports Explore and Review helper agents, with fallback to Primary when unset.",
  "settings.general.lightweightModel": "Lightweight model",
  "settings.general.lightweightModelDesc": "Handles title generation and quick internal summaries with a smaller, faster model.",
  "settings.general.customInstructions": "Custom instructions",
  "settings.general.customInstructionsDesc": "Standing instruction applied to every thread. Use it to define the agent's personality, constraints, and default behavior.",
  "settings.general.commitPrompt": "Commit message prompt",
  "settings.general.commitPromptDesc": "Prompt used by the Git panel when generating commit messages for the current profile.",
  "settings.general.notSet": "Not set",
  "settings.general.noModelsAvailable": "No models available. Enable providers and models first.",

  // ── Settings: Profiles Panel ───────────────────────────────
  "settings.profiles.newProfile": "New Profile",
  "settings.profiles.addProfile": "Add Profile",
  "settings.profiles.profileLibrary": "Profile Library",
  "settings.profiles.profileLibraryDesc": "Choose the active profile from the cards below, then tune its behavior, model routing, agent access, and instructions.",
  "settings.profiles.currentProfileLabel": "Current profile",
  "settings.profiles.behaviorSection": "Behavior",
  "settings.profiles.behaviorSectionDesc": "Control how this profile responds and how much reasoning it should use.",
  "settings.profiles.modelRoutingSection": "Models & Reasoning",
  "settings.profiles.modelRoutingSectionDesc": "Choose the model tiers for this profile and set how deeply the primary model should reason.",
  "settings.profiles.agentAccessSection": "Agent Access",
  "settings.profiles.agentAccessSectionDesc": "Choose which agents this profile can delegate work to.",
  "settings.profiles.instructionsSection": "Instructions",
  "settings.profiles.instructionsSectionDesc": "Define the persistent instructions and commit-message prompt for this profile.",

  // ── Settings: Agents Panel ─────────────────────────────────
  "settings.agents.builtInAgents": "Built-in Agents",
  "settings.agents.customAgents": "Custom Agents",
  "settings.agents.newAgent": "New Agent",
  "settings.agents.createAgent": "Create Agent",
  "settings.agents.newAgentName": "New Agent",
  "settings.agents.defaultSystemPrompt": "You are a helpful assistant.",
  "settings.agents.defaultInvocationDescription": "Describe when the main agent should use this subagent.",
  "settings.agents.builtIn.explore.name": "Explore",
  "settings.agents.builtIn.explore.desc": "Read-only code investigation for mapping files, dependencies, and current behavior.",
  "settings.agents.builtIn.review.name": "Review",
  "settings.agents.builtIn.review.desc": "Focused code review and verification after an implementation is complete.",
  "settings.agents.alwaysAvailable": "Always available",
  "settings.agents.builtInBadge": "Built-in",
  "settings.agents.delegation": "Agent Delegation",
  "settings.agents.delegationDesc": "Control whether this custom agent can delegate work to other agents.",
  "settings.agents.canDelegate": "Allow delegating to other agents",
  "settings.agents.canDelegateDesc": "When enabled, this agent will have agent_* tools available to spawn sub-agents for exploration, review, or parallel work.",
  "settings.agents.maxDelegationDepth": "Maximum delegation depth",
  "settings.agents.maxDelegationDepthDesc": "The deepest level this agent can be placed at in a delegation chain. Level 1 is the main agent, level 2 is a direct sub-agent, etc. Default: 3.",
  "settings.agents.delegationBadge": "Delegates · depth {{depth}}",
  "settings.agents.cannotDelegateBadge": "No delegation",
  "settings.agents.unsavedChanges": "Unsaved changes",
  "settings.agents.unsaved": "Unsaved",
  "settings.agents.saved": "Saved",
  "settings.agents.saving": "Saving...",
  "settings.agents.saveChanges": "Save Changes",
  "settings.agents.editorDescription": "Configure how this custom agent appears, when it is used, which model level it uses, and which tools it can call.",
  "settings.agents.identity": "Identity",
  "settings.agents.identityDesc": "Name the agent and define the tool identifier exposed to the main agent.",
  "settings.agents.name": "Name",
  "settings.agents.slug": "Slug",
  "settings.agents.toolName": "Tool name: agent_{{slug}}",
  "settings.agents.enabled": "Enabled",
  "settings.agents.disabled": "Disabled",
  "settings.agents.enabledDesc": "Disabled agents stay configured but are hidden from delegation.",
  "settings.agents.modelLevel": "Model level",
  "settings.agents.modelLevelDesc": "Choose which model tier from the current profile this custom agent should use.",
  "settings.agents.modelRole.primary": "Primary model",
  "settings.agents.modelRole.primaryDesc": "Use the profile's strongest model for complex delegated work.",
  "settings.agents.modelRole.auxiliary": "Auxiliary model",
  "settings.agents.modelRole.auxiliaryDesc": "Use the helper-agent model tier. Falls back to Primary when unset.",
  "settings.agents.modelRole.lightweight": "Lightweight model",
  "settings.agents.modelRole.lightweightDesc": "Use the faster lightweight tier. Falls back to Auxiliary, then Primary.",
  "settings.agents.behavior": "Behavior",
  "settings.agents.behaviorDesc": "Describe when to call the agent and how it should behave once delegated.",
  "settings.agents.invocationDescription": "Invocation Description",
  "settings.agents.invocationDescriptionHint": "This tells the main agent when this specialist should be used.",
  "settings.agents.systemPrompt": "System Prompt",
  "settings.agents.allowedTools": "Allowed Tools",
  "settings.agents.allowedToolsDesc": "Choose the tools this agent may call during delegated work.",
  "settings.agents.toolCategory.fileRead": "File System (Read)",
  "settings.agents.toolCategory.web": "Web Search",
  "settings.agents.toolCategory.fileWrite": "File System (Write)",
  "settings.agents.toolCategory.terminal": "Terminal",
  "settings.agents.toolCategory.git": "Git",
  "settings.agents.collapse": "Collapse",
  "settings.agents.edit": "Edit",
  "settings.agents.deleteAgent": "Delete {{name}}",
  "settings.agents.emptyTitle": "No custom agents yet",
  "settings.agents.emptyDesc": "Create a focused helper with its own instructions, model level, and allowed tools.",
  "settings.agents.discardTitle": "Discard unsaved agent changes?",
  "settings.agents.discardDesc": "You have unsaved edits in this custom agent. Discarding will lose those changes before continuing.",
  "settings.agents.continueEditing": "Continue editing",
  "settings.agents.discardChanges": "Discard changes",
"settings.agents.unsavedChangesTitle": "Leave without saving?",
"settings.agents.unsavedChangesLeaveDesc": "You have unsaved changes to a custom agent. Leaving will discard those changes.",
  "settings.agents.errorCreate": "Failed to create agent",
  "settings.agents.errorDelete": "Failed to delete agent",
  "settings.agents.errorSave": "Failed to save agent",
  "settings.agents.errorSlugConflict": "A custom agent with slug \"{{slug}}\" already exists",

  // ── Settings: Profile Agent Access ─────────────────────────
  "settings.profileAgentAccess.title": "Available Agents",
  "settings.profileAgentAccess.description": "Choose which custom agents this profile can delegate to. Built-in agents stay enabled for every profile.",
  "settings.profileAgentAccess.customAgents": "Custom Agents",
  "settings.profileAgentAccess.profileLevelAccess": "Profile-level access",
  "settings.profileAgentAccess.allowed": "Allowed",
  "settings.profileAgentAccess.toggleAccess": "Toggle access for {{name}}",
  "settings.profileAgentAccess.noDescription": "No delegation description provided yet.",
  "settings.profileAgentAccess.toolCount": "{{count}} tools",
  "settings.profileAgentAccess.emptyTitle": "No custom agents configured",
  "settings.profileAgentAccess.emptyDesc": "Go to Settings → Agents to create focused helpers with their own instructions, model level, and tools.",
  "settings.profileAgentAccess.builtIn.explore.name": "Explore",
  "settings.profileAgentAccess.builtIn.explore.desc": "Maps files, dependencies, and current behavior before implementation decisions.",
  "settings.profileAgentAccess.builtIn.explore.scope": "Read-only research",
  "settings.profileAgentAccess.builtIn.review.name": "Review",
  "settings.profileAgentAccess.builtIn.review.desc": "Reviews implemented changes, probes regressions, and reports verification status.",
  "settings.profileAgentAccess.builtIn.review.scope": "Post-change review",
  "settings.profileAgentAccess.capability.fileDiscovery": "File discovery",
  "settings.profileAgentAccess.capability.architectureNotes": "Architecture notes",
  "settings.profileAgentAccess.capability.currentStateSummary": "Current-state summary",
  "settings.profileAgentAccess.capability.diffReview": "Diff review",
  "settings.profileAgentAccess.capability.riskScan": "Risk scan",
  "settings.profileAgentAccess.capability.verificationReport": "Verification report",

  // ── Settings: Response Style Options ───────────────────────
  "settings.responseStyle.concise": "Concise",
  "settings.responseStyle.conciseDesc": "Very short, answer-first replies with minimal explanation.",
  "settings.responseStyle.balanced": "Balanced",
  "settings.responseStyle.balancedDesc": "Compact by default, with extra detail only when it helps.",
  "settings.responseStyle.guided": "Guided",
  "settings.responseStyle.guidedDesc": "Explanatory replies with reasoning, tradeoffs, and next steps.",

  // ── Settings: Thinking Level Options ─────────────────────
  "settings.thinkingLevel.off": "Off",
  "settings.thinkingLevel.offDesc": "No extended thinking. Standard response.",
  "settings.thinkingLevel.minimal": "Minimal",
  "settings.thinkingLevel.minimalDesc": "Light reasoning for straightforward tasks.",
  "settings.thinkingLevel.low": "Low",
  "settings.thinkingLevel.lowDesc": "Basic reasoning with modest token usage.",
  "settings.thinkingLevel.medium": "Medium",
  "settings.thinkingLevel.mediumDesc": "Balanced reasoning for most tasks.",
  "settings.thinkingLevel.high": "High",
  "settings.thinkingLevel.highDesc": "Deep reasoning for complex tasks.",
  "settings.thinkingLevel.xhigh": "Extra High",
  "settings.thinkingLevel.xhighDesc": "Maximum reasoning depth. Uses the most tokens.",

  // ── Settings: Profile Actions ──────────────────────────────
  "settings.profile.rename": "Rename",
  "settings.profile.duplicate": "Duplicate",
  "settings.profile.delete": "Delete",

  // ── Settings: About Panel ──────────────────────────────────
  "settings.about.description": "TiyCode is an AI-first desktop coding agent.",
  "settings.about.officialWebsite": "Official Website",
  "settings.about.license": "License",
  "settings.about.feedback": "Feedback",
  "settings.about.contactEmail": "Contact Email",
  "settings.about.checkingUpdates": "Checking for Updates...",
  "settings.about.checkForUpdates": "Check for Updates",
  "settings.about.copyright": "Copyright © 2026 Tiy.Ai All Rights Reserved.",
  "settings.about.termsOfService": "Terms of Service",
  "settings.about.privacyPolicy": "Privacy Policy",

  // ── In-app Updater ───────────────────────────────────────────
  "update.newVersionAvailable": "New Version Available",
  "update.currentVersion": "Current version: v{{version}}",
  "update.newVersion": "v{{version}}",
  "update.releaseNotes": "Release Notes",
  "update.downloadAndInstall": "Download & Install",
  "update.later": "Later",
  "update.brewDetected": "This app was installed via Homebrew. Please run the following command in your terminal to update:",
  "update.downloading": "Downloading Update...",
  "update.downloadProgress": "{{progress}}% completed",
  "update.readyToRestart": "Update Ready",
  "update.readyToRestartDesc": "The update has been downloaded and installed. Restart the app to apply.",
  "update.restartNow": "Restart Now",
  "update.restartLater": "Restart Later",
  "update.errorTitle": "Update Failed",
  "update.retry": "Retry",
  "update.close": "Close",

  // ── Settings: Commands Panel ───────────────────────────────
  "settings.commands.addPrompt": "Add Prompt",
  "settings.commands.createHint": "Create quick prompts that can be triggered by typing / in the chat",
  "settings.commands.untitled": "Untitled",
  "settings.commands.noDescription": "No description",
  "settings.commands.noArgumentHint": "No argument hint",
  "settings.commands.saveChanges": "Save changes",
  "settings.commands.cancelEditing": "Cancel editing",
  "settings.commands.editCommand": "Edit command",
  "settings.commands.removeCommand": "Remove command",
  "settings.commands.nameLabel": "Name",
  "settings.commands.descriptionLabel": "Description",
  "settings.commands.descriptionPlaceholder": "Describe what this command does in the picker",
  "settings.commands.argumentHintLabel": "Argument hint",
  "settings.commands.commandPromptLabel": "Command prompt",
  "settings.commands.commandPromptPlaceholder": "Write the expanded prompt sent to the model when this command is used...",

  // ── Settings: Terminal Panel ──────────────────────────────
  "settings.terminal.shell": "Shell",
  "settings.terminal.shellLabel": "Default shell",
  "settings.terminal.shellDesc": "Select the shell used by the embedded terminal. Leave as Auto to use the system default.",
  "settings.terminal.shellAutoDetect": "Auto (system default)",
  "settings.terminal.shellCustom": "Custom",
  "settings.terminal.shellArgsLabel": "Shell arguments",
  "settings.terminal.shellArgsDesc": "Extra arguments passed when launching the shell (e.g. --login).",
  "settings.terminal.shellArgsPlaceholder": "e.g. --login",
  "settings.terminal.appearance": "Appearance",
  "settings.terminal.fontFamilyLabel": "Font family",
  "settings.terminal.fontFamilyDesc": "Font stack used to render terminal text.",
  "settings.terminal.fontSizeLabel": "Font size",
  "settings.terminal.fontSizeDesc": "Terminal text size in pixels (8 - 32).",
  "settings.terminal.lineHeightLabel": "Line height",
  "settings.terminal.lineHeightDesc": "Spacing multiplier between terminal lines (1.0 - 2.0).",
  "settings.terminal.cursorStyleLabel": "Cursor style",
  "settings.terminal.cursorStyleDesc": "Shape of the terminal cursor.",
  "settings.terminal.cursorStyleBlock": "Block",
  "settings.terminal.cursorStyleUnderline": "Underline",
  "settings.terminal.cursorStyleBar": "Bar",
  "settings.terminal.cursorBlinkLabel": "Cursor blink",
  "settings.terminal.cursorBlinkDesc": "Whether the terminal cursor blinks.",
  "settings.terminal.behavior": "Behavior",
  "settings.terminal.scrollbackLabel": "Scrollback lines",
  "settings.terminal.scrollbackDesc": "Maximum number of lines kept in the scroll buffer (500 - 100,000).",
  "settings.terminal.copyOnSelectLabel": "Copy on select",
  "settings.terminal.copyOnSelectDesc": "Automatically copy selected text to clipboard.",
  "settings.terminal.environment": "Environment",
  "settings.terminal.termEnvLabel": "TERM variable",
  "settings.terminal.termEnvDesc": "Value of the TERM environment variable sent to the shell.",

  // ── Settings: Permissions Panel ────────────────────────────
  "settings.permissions.execution": "Execution",
  "settings.permissions.approvalPolicy": "Approval policy",
  "settings.permissions.allowed": "Allowed",
  "settings.permissions.allowedDesc": "Patterns the agent can use without approval. Prefix with `shell:` or `tool:<name> `, for example `shell:rm -rf /` or `tool:read .env.*`. Use simple glob matching inside the pattern: `*` matches any characters, `\\*` matches a literal asterisk, and `*foo*` works like contains.",
  "settings.permissions.denied": "Denied",
  "settings.permissions.deniedDesc": "Patterns the agent must never use. Prefix with `shell:` or `tool:<name> `, for example `shell:rm -rf /` or `tool:read .env.*`. Use simple glob matching inside the pattern: `*` matches any characters, `\\*` matches a literal asterisk, and `*foo*` works like contains.",
  "settings.permissions.add": "Add",
  "settings.permissions.empty": "Empty",
  "settings.permissions.confirm": "Confirm",
  "settings.permissions.cancel": "Cancel",
  "settings.permissions.editPattern": "Edit pattern",
  "settings.permissions.removePattern": "Remove pattern",
  "settings.permissions.patternPlaceholder": "e.g. tool:read .env.*, shell:rm -rf /, any:*tmp*",
  "settings.permissions.patternRequired": "Enter a pattern before saving this rule.",
  "settings.permissions.shellPatternRequired": "Use `shell:<pattern>`, for example `shell:rm -rf /`.",
  "settings.permissions.anyPatternRequired": "Use `any:<pattern>`, for example `any:*tmp*`.",
  "settings.permissions.toolPatternFormat": "Use `tool:<name> <pattern>`, for example `tool:read .env.*`.",
  "settings.permissions.writableRoots": "Writable roots",
  "settings.permissions.writableRootsDesc": "Additional directories the sandbox is allowed to write to.",
  "settings.permissions.emptyPath": "Empty path",
  "settings.permissions.editPath": "Edit path",
  "settings.permissions.removePath": "Remove path",

  // ── Settings: Approval Policy Options ──────────────────────
  "settings.policy.untrusted": "Untrusted",
  "settings.policy.untrustedDesc": "Approve every tool call and command individually.",
  "settings.policy.onRequest": "On request",
  "settings.policy.onRequestDesc": "Auto-approve safe actions, ask for risky ones.",
  "settings.policy.never": "Never",
  "settings.policy.neverDesc": "Let the agent run without approval prompts.",

  // ── Settings: Providers Panel ──────────────────────────────
  "settings.providers.customProvider": "Custom Provider",
  "settings.providers.catalogUpdated": "Model catalog updated from provider API.",
  "settings.providers.fetchFailed": "Failed to fetch provider models.",
  "settings.providers.connectionTestFailed": "Connection test failed.",
  "settings.providers.addProvider": "Add Provider",
  "settings.providers.searchProviders": "Search providers...",
  "settings.providers.customBadge": "custom",
  "settings.providers.builtInBadge": "Built-in",
  "settings.providers.activeBadge": "Active",
  "settings.providers.deleteProvider": "Delete provider",
  "settings.providers.toggleProvider": "Toggle provider",
  "settings.providers.providerName": "Provider Name",
  "settings.providers.baseUrl": "Base URL",
  "settings.providers.customBaseUrl": "Custom Base URL",
  "settings.providers.baseUrlHelper": "Choose a recommended endpoint or enter your own Base URL.",
  "settings.providers.apiKey": "API Key",
  "settings.providers.apiKeySaved": "Saved in app",
  "settings.providers.apiKeyNotSet": "Not set",
  "settings.providers.hideApiKey": "Hide API key",
  "settings.providers.showApiKey": "Show API key",
  "settings.providers.providerType": "Provider Type",
  "settings.providers.providerSettings": "Provider settings",
  "settings.providers.builtInMappingLocked": "Built-in providers stay mapped to their tiy-core provider type.",
  "settings.providers.customMappingHelper": "Choose which tiy-core provider type backs this custom provider.",
  "settings.providers.customHeaders": "Custom HTTP Headers",
  "settings.providers.customHeadersHelper": "Use JSON object format. Header values must be strings.",
  "settings.providers.savedOnValidJson": "Saved automatically when the JSON is valid.",
  "settings.providers.models": "Models",
  "settings.providers.modelIdPlaceholder": "Model ID (e.g., gpt-4o)",
  "settings.providers.displayNamePlaceholder": "Display Name (optional)",
  "settings.providers.addModelHelper": "Add models manually or use Fetch to load from API",
  "settings.providers.searchModels": "Search models...",
  "settings.providers.fetching": "Fetching...",
  "settings.providers.fetch": "Fetch",
  "settings.providers.enabledModelsFirst": " (enabled models shown first)",
  "settings.providers.selectProvider": "Select a provider to configure",
  "settings.providers.manualBadge": "Manual",
  "settings.providers.testingConnection": "Testing connection",
  "settings.providers.testConnection": "Test connection",
  "settings.providers.settingsButton": "Settings",
  "settings.providers.removeModel": "Remove model",
  "settings.providers.testingConnectionStatus": "Testing connection...",
  "settings.providers.modelId": "Model ID",
  "settings.providers.displayName": "Display Name",
  "settings.providers.modelCapabilities": "Model Capabilities",
  "settings.providers.modelCapabilitiesDesc": "Override the auto-detected capabilities for this model.",
  "settings.providers.auto": "(auto)",
  "settings.providers.contextWindow": "Context Window",
  "settings.providers.maxOutputTokens": "Max Output Tokens",
  "settings.providers.modelOptionsJson": "Model Options (JSON)",
  "settings.providers.headerValidationError": "Custom HTTP Headers must be a JSON object.",
  "settings.providers.headerValueError": "Header \"{{key}}\" must use a string value.",
  "settings.providers.headerJsonError": "Invalid JSON. Example: {\"HTTP-Referer\": \"https://example.com\"}",
  "settings.providers.optionsValidationError": "Provider Options must be a JSON object.",
  "settings.providers.optionsJsonError": "Invalid JSON. Example: {\"thinking\": {\"type\": \"disabled\"}}",

  // ── Settings: Model Capabilities ───────────────────────────
  "settings.capability.vision": "Vision",
  "settings.capability.imageOutput": "Image Output",
  "settings.capability.toolCalling": "Tool Calling",
  "settings.capability.reasoning": "Reasoning",
  "settings.capability.embedding": "Embedding",

  // ── Settings: Workspace Panel ──────────────────────────────
  "settings.workspace.openInFileManager": "Open in file manager",
  "settings.workspace.newWorkspace": "New Workspace",
  "settings.workspace.chooseFolderTitle": "Choose workspace folder",
  "settings.workspace.addWorkspace": "Add workspace",
  "settings.workspace.noWorkspaces": "No workspaces configured.",
  "settings.workspace.addToGetStarted": "Add a workspace to get started.",
  "settings.workspace.defaultBadge": "Default",
  "settings.workspace.gitBadge": "Git",
  "settings.workspace.setAsDefault": "Set as default",
  "settings.workspace.openingFolder": "Opening folder",
  "settings.workspace.removeWorkspace": "Remove workspace",

  // ── Extensions Center ──────────────────────────────────────
  "extensions.backToApp": "Back to app",
  "extensions.title": "Extensions Center",
  "extensions.tab.plugins": "Plugins",
  "extensions.tab.pluginsDesc": "Local extension packages with tools, hooks, commands, and optional skill packs.",
  "extensions.tab.mcpServers": "MCP Servers",
  "extensions.tab.mcpServersDesc": "Managed connector entries with transport status, phase, snapshots, and reconnect controls.",
  "extensions.tab.skills": "Skills",
  "extensions.tab.skillsDesc": "Indexed prompt assets from builtin, workspace, and plugin sources with enable controls.",
  "extensions.searchPlaceholder": "Search {{label}}",
  "extensions.refresh": "Refresh",
  "extensions.addSource": "Add source",
  "extensions.addMcp": "Add MCP",
  "extensions.configIssuesDetected": "Configuration issues detected",
  "extensions.rescanSkills": "Rescan skills",
  "extensions.install": "Install",
  "extensions.disable": "Disable",
  "extensions.enable": "Enable",
  "extensions.remove": "Remove",
  "extensions.edit": "Edit",
  "extensions.restart": "Restart",
"extensions.actionFailed": "Action failed",
"extensions.processing": "Processing…",
  "extensions.commandsBadge": "commands",
  "extensions.mcpsBadge": "mcps",
  "extensions.skillsBadge": "skills",
  "extensions.hooksBadge": "hooks",
  "extensions.toolsBadge": "tools",
  "extensions.resourcesBadge": "resources",
  "extensions.staleSnapshot": "stale snapshot",
  "extensions.triggersBadge": "triggers",
  "extensions.noMatch": "No {{label}} match the current search.",
  "extensions.capabilities": "Capabilities",
  "extensions.permissions": "Permissions",
  "extensions.tools": "Tools",
  "extensions.commands": "Commands",
  "extensions.noBundledCommands": "No bundled commands.",
  "extensions.mcps": "MCPs",
  "extensions.noBundledMcps": "No bundled MCP servers.",
  "extensions.skills": "Skills",
  "extensions.noBundledSkills": "No bundled skills.",
  "extensions.hooks": "Hooks",
  "extensions.noHooksDeclared": "No hooks declared.",
  "extensions.source": "Source",
  "extensions.marketplaceSources": "Marketplace Sources",
  "extensions.pluginsBadge": "plugins",
  "extensions.noMarketplaceSources": "No marketplace sources configured.",
  "extensions.pluginBadge": "plugin",
  "extensions.actions": "Actions",
  "extensions.parameters": "Parameters",
  "extensions.requiredBadge": "required",
  "extensions.noDiscoveredTools": "No discovered tools yet.",
  "extensions.skillBadge": "skill",
  "extensions.previewSkillMarkdown": "Preview skill markdown",
  "extensions.noTriggersDefined": "No triggers defined.",
  "extensions.noToolRequirements": "No tool requirements declared.",
  "extensions.loadingDetails": "Loading {{label}} details...",
  "extensions.selectToInspect": "Select a {{label}} item to inspect details.",
  "extensions.builtinBadge": "Builtin",
  "extensions.enabledBadge": "enabled",
  "extensions.disabledBadge": "disabled",

  // ── Extensions: Skill Preview Dialog ───────────────────────
  "extensions.skillPreview": "Skill preview",
  "extensions.skillPreviewDesc": "Skill markdown preview",
  "extensions.closeSkillPreview": "Close skill preview",
  "extensions.skillMdPreview": "SKILL.md Preview",
  "extensions.frontmatter": "Frontmatter",

  // ── Extensions: MCP Dialog ─────────────────────────────────
  "extensions.addMcpServer": "Add MCP server",
  "extensions.editMcpServer": "Edit MCP server",
  "extensions.mcpDialogDesc": "Manage settings-backed MCP entries. Sensitive fields stay masked in the runtime views and activity logs.",
  "extensions.serverIdPlaceholder": "server id",
  "extensions.displayNamePlaceholder": "display name",
  "extensions.transportPlaceholder": "Transport",
  "extensions.timeoutPlaceholder": "timeout (ms)",
  "extensions.commandPlaceholder": "command",
  "extensions.argsPlaceholder": "args separated by spaces",
  "extensions.headersHelper": "Use one `Header: value` per line. Masked values are kept unless you replace or remove them.",
"extensions.envLabel": "Environment Variables",
"extensions.envHelper": "One `KEY: value` per line. Variables are passed to the server process.",
  "extensions.enableOnSave": "Enable on save",
  "extensions.disabledEntryHint": "Disabled entries stay registered but won't start.",
  "extensions.cancelButton": "Cancel",
  "extensions.createButton": "Create",
  "extensions.saveButton": "Save",

  // ── Extensions: Marketplace Source Dialog ───────────────────
  "extensions.addMarketplaceSource": "Add marketplace source",
  "extensions.marketplaceSourceDesc": "Register a git-backed plugin market and let Tiy scan its plugin directories dynamically.",
  "extensions.addingSourceStatus": "Adding source and syncing its repository...",
  "extensions.addingSourceHelper": "The source will be saved and synced before it appears in the plugin catalog.",
  "extensions.addingSource": "Adding source...",

  // ── Extensions: Remove Source Dialog ───────────────────────
  "extensions.cantRemoveSource": "Can't remove source",
  "extensions.removeSource": "Remove source",
  "extensions.checkingRemovable": "Checking whether this source can be removed.",
  "extensions.hasEnabledPlugins": "This source still has enabled plugins. Disable them before removing the source.",
  "extensions.removeWarning": "Removing this source will also remove installed plugins from it that are not enabled.",
  "extensions.loadingRemovalDetails": "Loading source removal details...",
  "extensions.enabledPluginsBlocking": "Enabled plugins blocking removal",
  "extensions.enabledPluginBadge": "enabled",
  "extensions.pluginsToRemove": "Plugins to remove",
  "extensions.installedBadge": "installed",
  "extensions.noPluginsToRemove": "No installed plugins from this source will be removed.",
  "extensions.closeButton": "Close",
  "extensions.removeSourceConfirm": "Remove source",

  // ── Marketplace ────────────────────────────────────────────
  "marketplace.backToApp": "Back to app",
  "marketplace.title": "Marketplace",
  "marketplace.subtitle": "Browse skills, MCP servers, plugins, and scheduled automations in one catalog view.",
  "marketplace.tab.skills": "Skills",
  "marketplace.tab.skillsDesc": "Focused instructions and reusable workflows for everyday coding tasks.",
  "marketplace.tab.mcp": "MCP",
  "marketplace.tab.mcpDesc": "Live servers that connect the assistant to tools, APIs, and current data.",
  "marketplace.tab.plugins": "Plugins",
  "marketplace.tab.pluginsDesc": "Workbench add-ons that extend desktop surfaces and task-oriented utilities.",
  "marketplace.tab.automations": "Automations",
  "marketplace.tab.automationsDesc": "Scheduled tasks and recurring workflows that run with minimal manual work.",
  "marketplace.empty.installedSkills": "No installed skills match this search yet.",
  "marketplace.empty.installedMcp": "No installed MCP match this search yet.",
  "marketplace.empty.installedPlugins": "No installed plugins match this search yet.",
  "marketplace.empty.installedAutomations": "No installed automations match this search yet.",
  "marketplace.empty.recommendedSkills": "No recommended skills match the current search.",
  "marketplace.empty.recommendedMcp": "No recommended MCP match the current search.",
  "marketplace.empty.recommendedPlugins": "No recommended plugins match the current search.",
  "marketplace.empty.recommendedAutomations": "No recommended automations match the current search.",
  "marketplace.search.skills": "Search skills, workflows, and prompt packs",
  "marketplace.search.mcp": "Search MCP, integrations, and tools",
  "marketplace.search.plugins": "Search plugins, add-ons, and desktop extensions",
  "marketplace.search.automations": "Search automations, schedules, and recurring tasks",
  "marketplace.status.available": "Available",
  "marketplace.status.installedEnabled": "Installed + Enabled",
  "marketplace.status.installedDisabled": "Installed + Disabled",
  "marketplace.uninstall": "Uninstall",
  "marketplace.installed": "Installed",
  "marketplace.recommended": "Recommended",
  "marketplace.addSource": "Add source",
  "marketplace.addSourceSubtitle": "Prepare custom source and URL-based install flows",
  "marketplace.recommendedBadge": "Recommended",
  "marketplace.actionsSection": "Actions",
  "marketplace.detailsSection": "Details",
  "marketplace.publisher": "Publisher",
  "marketplace.sourceLabel": "Source",
  "marketplace.category": "Category",
  "marketplace.capabilitiesSection": "Capabilities",
  "marketplace.emptyDrawerDesc": "Prepare curated team catalogs or direct package installs without leaving the workbench.",
  "marketplace.customSource": "Custom source",
  "marketplace.customSourceDesc": "Register organization catalogs, internal package feeds, or curated team bundles.",
  "marketplace.installFromUrl": "Install from URL",
  "marketplace.installFromUrlDesc": "Paste a package URL, git repository, or managed source endpoint to install directly.",

  // ── Onboarding Wizard ──────────────────────────────────
  "onboarding.welcome": "Welcome to TiyCode",
  "onboarding.welcomeDesc": "Let\u2019s take a minute to configure your setup for the best experience.",
  "onboarding.skip": "Skip setup",
  "onboarding.next": "Next",
  "onboarding.back": "Back",
  "onboarding.finish": "Get started",
  "onboarding.stepOf": "Step {{current}} of {{total}}",

  // ── Step 1: Language & Theme ───────────────────────────
  "onboarding.langTheme.title": "Language & Theme",
  "onboarding.langTheme.desc": "Choose your interface language and appearance. Response language will match your interface language automatically.",
  "onboarding.langTheme.languageLabel": "Interface language",
  "onboarding.langTheme.themeLabel": "Appearance",
  "onboarding.langTheme.themeAuto": "System",
  "onboarding.langTheme.themeDark": "Dark",
  "onboarding.langTheme.themeLight": "Light",

  // ── Step 2: Configure Provider ─────────────────────────
  "onboarding.provider.title": "Configure model provider",
  "onboarding.provider.desc": "Select a provider, enter your API key, then load and enable models.",
  "onboarding.provider.selectProvider": "Select a provider",
  "onboarding.provider.addCustom": "Add custom provider",
  "onboarding.provider.apiKeyLabel": "API Key",
  "onboarding.provider.apiKeyPlaceholder": "Enter your API key",
  "onboarding.provider.baseUrlLabel": "Base URL",
  "onboarding.provider.saveKey": "Save key",
  "onboarding.provider.fetchModels": "Load models",
  "onboarding.provider.fetchingModels": "Loading...",
  "onboarding.provider.fetchSuccess": "Loaded {{count}} models successfully",
  "onboarding.provider.fetchError": "Failed to load models: {{message}}",
  "onboarding.provider.modelsLabel": "Models",
  "onboarding.provider.searchModels": "Search models",
  "onboarding.provider.noModels": "No models available. Load models first.",
  "onboarding.provider.enableAtLeastOne": "Enable at least one model to continue.",
  "onboarding.provider.providerTypeLabel": "Provider type",
  "onboarding.provider.displayNameLabel": "Display name",

  // ── Step 3: Configure Profile ──────────────────────────
  "onboarding.profile.title": "Configure model profile",
  "onboarding.profile.desc": "Assign three tiers of models to the default profile. You can change this later in settings.",
  "onboarding.profile.primaryLabel": "Primary model",
  "onboarding.profile.primaryDesc": "Main model for core tasks: code generation, complex reasoning, and multi-step orchestration.",
  "onboarding.profile.auxiliaryLabel": "Auxiliary model",
  "onboarding.profile.auxiliaryDesc": "Supporting model for code review, test generation, and context summarization.",
  "onboarding.profile.liteLabel": "Light model",
  "onboarding.profile.liteDesc": "Lightweight model for fast tasks: commit messages, quick Q&A, and formatting.",
  "onboarding.profile.selectModel": "Select a model",
  "onboarding.profile.noEnabledModels": "No enabled models found. Go back and enable at least one model.",

  // ── Step 4: Complete ───────────────────────────────────
  "onboarding.complete.title": "All set!",
  "onboarding.complete.desc": "Configuration complete. You can adjust these settings anytime.",
  "onboarding.complete.tip": "Tip: Use the top menu bar to quickly switch theme and language.",

  // ── Worktree ───────────────────────────────────────────
  "worktree.createTitle": "New worktree",
  "worktree.createDescription": "Create a new worktree for this Git repository.",
  "worktree.field.branch": "New branch name",
  "worktree.field.branchPlaceholder": "Type a new branch name",
  "worktree.field.baseBranch": "Base branch",
  "worktree.field.baseBranchHint": "New branch will be created from {{branch}}",
  "worktree.field.path": "Worktree directory",
  "worktree.field.pathPlaceholder": "Auto-generated path",
  "worktree.field.pathBrowse": "Browse…",
  "worktree.field.pathHint": "Leave empty to auto-generate under ~/.tiy/workspace/<hash>/<repo>.",
  "worktree.submit": "Create worktree",
  "worktree.submitting": "Creating…",
  "worktree.cancel": "Cancel",
  "worktree.menu.newWorktree": "New worktree…",
  "worktree.removeConfirm": "Removing this worktree will delete the directory on disk and all related threads. Continue?",
  "worktree.error.branchRequired": "Branch name is required",
  "worktree.error.selectRepo": "Worktrees can only be created on a Git repository workspace",
  "worktree.empty.branches": "No branches yet",
  "worktree.loading.branches": "Loading…",
  "worktree.tag.label": "Worktree",
  "worktree.mode.newBranch": "New branch",
  "worktree.mode.existingBranch": "Existing branch",
  "worktree.field.selectBranch": "Select branch",
  "worktree.field.selectBranchHint": "Check out this existing branch into a new worktree",
  "worktree.error.selectBranch": "Please select a branch",
  "contextCompressing": "Compressing context…",
  "run.retrying": "Regenerating response… {{attempt}}/{{maxAttempts}}",
  "requestRetry.reconnecting": "Reconnecting… {{attempt}}/{{maxRetries}}",
  "requestRetry.status": "HTTP {{status}}",
  "requestRetry.delay": "Retrying in {{seconds}}s",

  // ── Artifact Card ─────────────────────────────────────────
  "artifact.collapseCode": "Collapse code",
  "artifact.expandCode": "Expand code",
  "artifact.preview": "Preview",

  // ── Message actions ───────────────────────────────────────
  "message.copy": "Copy message",
  "message.copied": "Copied",

  // ── Long message preview ──────────────────────────────────
  "longMessage.collapseAll": "Collapse",
  "longMessage.expandAll": "Expand",
  "longMessage.hiddenLines": "~{{count}} lines collapsed",
  "longMessage.hiddenContent": "Long content collapsed to optimize loading and scrolling",

  // ── File Context Menu ─────────────────────────────────────
  "fileContextMenu.newFolder": "New Folder",
  "fileContextMenu.newFile": "New File",
  "fileContextMenu.createIn": "Create in:",
  "fileContextMenu.folderPlaceholder": "folder-name",
  "fileContextMenu.filePlaceholder": "file-name.ext",
  "fileContextMenu.file": "File",
  "fileContextMenu.folder": "Folder",
  "fileContextMenu.creating": "Creating…",
  "fileContextMenu.create": "Create",
  "fileContextMenu.rename": "Rename",
  "fileContextMenu.renaming": "Renaming…",
  "fileContextMenu.deleteAction": "Delete",
  "fileContextMenu.cancel": "Cancel",
  "fileContextMenu.deleting": "Deleting…",
  "fileContextMenu.deleteFileTitle": "Delete File",
  "fileContextMenu.deleteFolderTitle": "Delete Folder",
  "fileContextMenu.deleteConfirm": "Are you sure you want to delete {{path}}?",
  "fileContextMenu.deleteRecursive": "This will delete all contents recursively.",
  "fileContextMenu.fileActions": "File actions",
  "fileContextMenu.copyRelativePath": "Copy Relative Path",
  "fileContextMenu.copyPath": "Copy Path",
  "fileContextMenu.openInExternalApp": "Open in External App",

  // ── File Editor ──────────────────────────────────────────
  "fileEditor.loading": "Loading…",
  "fileEditor.save": "Save",
  "fileEditor.saveShortcut": "Save (Ctrl/Cmd + S)",
  "fileEditor.htmlPreview": "HTML Preview",
  "fileEditor.editor": "Editor",
  "fileEditor.preview": "Preview",
  "fileEditor.refresh": "Refresh preview from disk",
  "fileEditor.refreshDisabledDirty": "Save changes before refreshing",
  "fileEditor.closePreview": "Close preview",
  "fileEditor.binaryFile": "Binary file — cannot edit",

  // ── Dashboard (extended) ─────────────────────────────────
  "dashboard.preparingTerminal": "Preparing terminal…",
  "dashboard.filePreviewEditor": "File Preview / Editor",

  // ── Goal ──────────────────────────────────────────────────
  "goal.status.active": "Active",
  "goal.status.paused": "Paused",
  "goal.status.budgetLimited": "Budget Exhausted",
  "goal.status.complete": "Complete",
  "goal.status.verified": "Verified",
  "goal.time.elapsed": "Running for {{time}}",
  "goal.time.hoursMinutes": "{{hours}}h {{minutes}}m",
  "goal.time.minutesSeconds": "{{minutes}}m {{seconds}}s",
  "goal.time.seconds": "{{seconds}}s",
  "goal.action.pause": "Pause goal",
  "goal.action.resume": "Resume goal",
  "goal.action.clear": "Clear goal",
};

export default en;
