mirror of
https://github.com/NanmiCoder/claude-code-haha.git
synced 2026-10-10 03:43:11 +08:00
9623064b15
* fix(agent-teams): keep a stopped team stopped and wake members after any failure Stop killed every member, but the lead kept polling its mailbox: reports sent before the Stop started hidden lead turns, and a single SendMessage from one of them unpaused the whole team. Stop now sends team_plan_pause so the lead holds teammate mail until the user's next message, and the server only lets lead instructions written after that message resume the team. A restart in flight when Stop arrives is stopped as well, and the idle Stop button hides once every member is stopped. Members that stopped on a usage limit, billing, network or crash failure were only resumed if the lead happened to message them. The user's next message now lists every stopped member with its failure and open tasks, once per failure, whether or not Stop was pressed. * feat(desktop): show where each team member stands on its tasks A member that stopped or failed left its task reading "In progress" with an animated bar, and its card said only "Stopped" or "Error". Tasks whose owner stopped, failed or waits to retry now show that state without animation, and the card says which task the member stopped on. The member card chips tell done, current and next tasks apart, with the subject on hover. The member drawer groups tasks into now, up next and done, names the unfinished dependencies of blocked work, shows done as 3/5, and no longer prints +0:00 for a duration polling could not measure.
4209 lines
280 KiB
TypeScript
4209 lines
280 KiB
TypeScript
export const en = {
|
||
"teamPlan.state.interrupted": "Team interrupted · started work will not be replayed",
|
||
"teamPlan.savePreset": "Save the preset changes first, then review the resolved models before approving.",
|
||
"teamPlan.unspecified": "Not provided",
|
||
"teamPlan.stop": "Stop team and main task",
|
||
"teamPlan.stopping": "Stopping team and main task…",
|
||
"teamPlan.configureMember": "Configure {name}",
|
||
"teamPlan.roster": "Team roster",
|
||
"teamPlan.assignment": "Assignment",
|
||
"teamPlan.memberBrief": "Role brief",
|
||
"teamPlan.noTasks": "No tasks assigned",
|
||
"teamPlan.selectedCount": "{count} selected",
|
||
"teamPlan.allTasks": "Task assignments",
|
||
"teamPlan.saved": "All changes saved",
|
||
"teamPlan.unsaved": "Unsaved changes",
|
||
"teamPlan.reviewHint": "Review each role, then launch together.",
|
||
"teamPlan.title": "Team launch review",
|
||
"teamPlan.memberCount": "{count} members",
|
||
"teamPlan.open": "Review configuration",
|
||
"teamPlan.close": "Close",
|
||
"teamPlan.save": "Save draft",
|
||
"teamPlan.return": "Request revision",
|
||
"teamPlan.cancel": "Cancel team",
|
||
"teamPlan.approve": "Approve and launch",
|
||
"teamPlan.retry": "Review again",
|
||
"teamPlan.description": "Review each member’s preset, task and model before launch. Changes apply only to this team. Task complexity and configuration suggestions are assessed by the lead agent.",
|
||
"teamPlan.leader": "Lead agent (read-only)",
|
||
"teamPlan.official": "Claude official",
|
||
"teamPlan.provider": "Provider",
|
||
"teamPlan.conflict": "The plan changed in another window or by the lead agent. Your edits are preserved; review the latest version before continuing.",
|
||
"teamPlan.reload": "Use latest plan",
|
||
"teamPlan.reapply": "Apply my edits to latest plan",
|
||
"teamPlan.agentsError": "Could not load agent presets. Model and task edits are preserved.",
|
||
"teamPlan.selectAll": "Select all members",
|
||
"teamPlan.batch": "Set model for selected members",
|
||
"teamPlan.followLeader": "Use lead model for selected",
|
||
"teamPlan.restore": "Restore suggested models",
|
||
"teamPlan.costHint": "Choose economical models for simple work and stronger models for complex tasks. Prices depend on the provider; no cost estimate is shown.",
|
||
"teamPlan.difficulty": "Task complexity",
|
||
"teamPlan.high": "Complex",
|
||
"teamPlan.medium": "Moderate",
|
||
"teamPlan.low": "Simple",
|
||
"teamPlan.agent": "Agent preset",
|
||
"teamPlan.model": "Provider and model",
|
||
"teamPlan.prompt": "Member instructions",
|
||
"teamPlan.tasks": "Task assignments",
|
||
"teamPlan.dependencies": "Dependencies",
|
||
"teamPlan.unassigned": "Unassigned",
|
||
"teamPlan.assignRequired": "Assign this task to a member before approving.",
|
||
"teamPlan.invalidMemberNames": "Cannot launch members named {names}. Names may use only letters, numbers, underscores or hyphens; team-lead is reserved. Request a revision from the lead agent.",
|
||
"teamPlan.owner": "Assigned member",
|
||
"teamPlan.feedback": "Revision feedback (required to return)",
|
||
"teamPlan.state.draft": "Lead agent is revising the plan",
|
||
"teamPlan.state.review_pending": "Awaiting review · no members launched",
|
||
"teamPlan.state.launching": "Launching team",
|
||
"teamPlan.state.running": "Team launched",
|
||
"teamPlan.state.launch_failed": "Launch failed · review details before retrying",
|
||
"teamPlan.state.cancelled": "Team cancelled",
|
||
|
||
|
||
'sideChat.closeTitle': 'Close side chat?',
|
||
'sideChat.closeBody': 'This temporary conversation will be deleted and any running response will stop.',
|
||
'sideChat.emptyDescription': 'This temporary conversation is cleared when you close its tab or quit the app.',
|
||
'chat.selectedText': 'Selected text',
|
||
'sideChat.title': 'Side chat',
|
||
'chat.askSelectionInSideChat': 'Ask in side chat',
|
||
'chat.selectionActions': 'Selected text actions',
|
||
"sideQuestion.title": "Side question",
|
||
"sideQuestion.clear": "Clear side-question history",
|
||
"sideQuestion.close": "Close side questions",
|
||
"sideQuestion.hint": "Ask about this conversation without interrupting the main task. Answers stay here for this app session.",
|
||
"sideQuestion.empty": "Ask a quick question about the current conversation.",
|
||
"sideQuestion.thinking": "Thinking…",
|
||
"sideQuestion.cancelled": "Cancelled",
|
||
"sideQuestion.failed": "Could not answer this side question.",
|
||
"sideQuestion.copy": "Copy answer",
|
||
"sideQuestion.copied": "Copied",
|
||
"sideQuestion.input": "Your question",
|
||
"sideQuestion.placeholder": "Ask a question or follow up…",
|
||
"sideQuestion.cancel": "Cancel question",
|
||
"sideQuestion.send": "Ask",
|
||
"sideQuestion.commandDescription": "Ask a side question without interrupting this task",
|
||
|
||
"settings.chatAppearance.title": "Chat appearance",
|
||
"settings.chatAppearance.description": "Adjust chat text independently of UI zoom. Changes apply immediately on this device.",
|
||
"settings.chatAppearance.reset": "Reset chat appearance",
|
||
"settings.chatAppearance.font": "Chat font",
|
||
"settings.chatAppearance.fontSystem": "System default",
|
||
"settings.chatAppearance.fontSans": "Sans serif",
|
||
"settings.chatAppearance.fontSerif": "Serif",
|
||
"settings.chatAppearance.fontMono": "Monospace",
|
||
"settings.chatAppearance.fontSize": "Chat font size",
|
||
"settings.chatAppearance.width": "Conversation width",
|
||
"settings.chatAppearance.widthStandard": "Standard",
|
||
"settings.chatAppearance.widthWide": "Wide",
|
||
"settings.chatAppearance.widthFull": "Fill available space",
|
||
"settings.chatAppearance.hint": "Fonts use those available on your system. Code stays monospace. Width applies to messages and the composer; narrow windows fit automatically.",
|
||
"settings.chatAppearance.preview": "Font preview",
|
||
"settings.chatAppearance.previewMarkdown": "### A clearer conversation\n\nAdjust text for comfortable reading. 中文・日本語・한국어 · Hello 123.\n\n- Lists follow your chosen font and size.\n- Inline code stays monospace: `const answer = 42`.\n\n| Content | Example |\n| --- | --- |\n| Body text | Read at your own pace |",
|
||
"chat.sessionNoProject": "No project",
|
||
"chat.referenceSessions": "Sessions",
|
||
"chat.sessionReferencesLoadFailed": "Could not load sessions.",
|
||
"chat.openReferencedSession": "Open session {id}",
|
||
"chat.collaborationMessageFrom": "Sent by {id} from another session",
|
||
"chat.collaborationQueued": "Queued",
|
||
"chat.collaborationRunning": "Running",
|
||
"chat.collaborationIdle": "Idle",
|
||
"chat.collaborationBlocked": "Needs attention",
|
||
"chat.collaborationCompleted": "Completed",
|
||
"chat.collaborationFailed": "Failed",
|
||
"chat.collaborationStopped": "Stopped",
|
||
|
||
"chat.history.loading": "Loading messages…",
|
||
"chat.history.loadFailed": "Could not load messages.",
|
||
"chat.history.retry": "Try again",
|
||
"chat.history.loadMore": "Load earlier messages",
|
||
|
||
"trace.windowNotice": "Transcript and trace use bounded pages.",
|
||
"trace.windowLimited": "Some records exceed the viewing limit; the original file is unchanged.",
|
||
"trace.windowFirst": "First page / Live",
|
||
"trace.windowPrevious": "Previous page",
|
||
"trace.windowNext": "Next page",
|
||
"trace.windowScanNext": "Scan next segment",
|
||
|
||
"extensions.myPlugins": "My plugins",
|
||
"extensions.mySkills": "My skills",
|
||
"extensions.browse": "Back to browse",
|
||
"extensions.managedSkillHint": "Companion skills are managed with their plugin. Manage local and project skills in their source directories.",
|
||
"extensions.searchPlugins": "Search plugins",
|
||
"extensions.searchSkills": "Search featured skills",
|
||
"extensions.pluginsSubtitle": "Connect everyday services or add creative and development tools to your assistant.",
|
||
"extensions.filter": "Filter extensions",
|
||
"extensions.categories": "Extension categories",
|
||
"extensions.empty": "No matching extensions",
|
||
"chat.references": "References",
|
||
"chat.referencePlugins": "Plugins",
|
||
"chat.referenceSkills": "Skills",
|
||
"chat.referenceFiles": "Files",
|
||
"chat.referencesLoadFailed": "Could not load skills and plugins",
|
||
"chat.referencesEmpty": "No matching references",
|
||
"chat.referenceDescription": "Description",
|
||
"chat.referenceSource": "Source",
|
||
"chat.referenceDetails": "Reference details",
|
||
"sidebar.extensions": "Skills · Connectors",
|
||
"extensions.sections": "Market sections",
|
||
"extensions.plugins": "Plugins",
|
||
"extensions.skills": "Skills",
|
||
"extensions.featuredSkills": "Featured skills",
|
||
"connectors.airtable.description": "Query tables, records and team information.",
|
||
"connectors.airtable.example": "Review recently updated project records in Airtable.",
|
||
"connectors.airtable.name": "Airtable",
|
||
"connectors.airtable.requirements": "Authorize workspaces or bases in the browser. Enterprise administrators may restrict client access.",
|
||
"connectors.algorithmic-art.name": "Algorithmic art",
|
||
"connectors.algorithmic-art.description": "Create adjustable algorithmic art and interactive visuals with p5.js.",
|
||
"connectors.algorithmic-art.example": "Build a flow-field artwork page with adjustable colors and density.",
|
||
"connectors.algorithmic-art.requirements": "Includes templates and reference code. Previewing needs a browser and p5.js resources. Installation does not execute scripts or call generation models.",
|
||
"connectors.atlassian.description": "Search Jira, Confluence and project collaboration content.",
|
||
"connectors.atlassian.example": "Summarize my Jira issues and link relevant Confluence pages.",
|
||
"connectors.atlassian.name": "Atlassian",
|
||
"connectors.atlassian.requirements": "Requires an Atlassian Cloud account and product access through browser authorization. Some products and operations need administrator enablement.",
|
||
"connectors.bazhuayu.description": "Find collection templates, cloud tasks and collected data.",
|
||
"connectors.bazhuayu.example": "List supported platforms without creating or starting collection tasks.",
|
||
"connectors.bazhuayu.name": "Octoparse China",
|
||
"connectors.bazhuayu.requirements": "Requires an Octoparse China account API Key. Cloud collection only; running tasks may consume balance and some templates require specific plans.",
|
||
"connectors.canvas-design.name": "Canvas design",
|
||
"connectors.canvas-design.description": "Create posters, static artwork and PDF canvases, with bundled fonts.",
|
||
"connectors.canvas-design.example": "Design a technology event poster and export it as PDF.",
|
||
"connectors.canvas-design.requirements": "Includes the complete design skill, fonts and their licenses. Image or PDF generation needs Python and suitable drawing libraries, which are not installed automatically.",
|
||
"connectors.clickup.description": "Find projects, tasks and team work materials.",
|
||
"connectors.clickup.example": "List unfinished ClickUp tasks assigned to me.",
|
||
"connectors.clickup.name": "ClickUp",
|
||
"connectors.clickup.requirements": "Requires a ClickUp account and workspace access, authorized in the browser. The service is in public beta.",
|
||
"connectors.cloudflare.description": "Inspect and manage websites, networking and cloud resources.",
|
||
"connectors.cloudflare.example": "Review my Cloudflare resources and summarize their configuration.",
|
||
"connectors.cloudflare.name": "Cloudflare",
|
||
"connectors.cloudflare.requirements": "Requires a user or account API Token with the necessary resource permissions. Deployments and configuration changes require an explicit task.",
|
||
"connectors.drawio.name": "draw.io diagrams",
|
||
"connectors.drawio.description": "Create editable architecture, flow and relationship diagrams.",
|
||
"connectors.drawio.example": "Turn this system description into an editable draw.io architecture diagram.",
|
||
"connectors.drawio.requirements": "Write .drawio XML directly. Mermaid conversion, automatic layout and image export require the draw.io desktop CLI. Installing this skill does not install the desktop app.",
|
||
"connectors.firecrawl.description": "Search the web and extract pages for research.",
|
||
"connectors.firecrawl.example": "Find technical resources on browser automation and keep source links.",
|
||
"connectors.firecrawl.name": "Firecrawl",
|
||
"connectors.firecrawl.requirements": "Requires a Firecrawl API Key. Usage is billed against the account quota; the key is sent in a secure request header.",
|
||
"connectors.frontend-design.name": "Frontend design",
|
||
"connectors.frontend-design.description": "Build frontend interfaces with clear visual hierarchy.",
|
||
"connectors.frontend-design.example": "Design and implement a home page for my knowledge management app.",
|
||
"connectors.frontend-design.requirements": "Installs the Anthropic frontend design skill. Previewing and building require the target project dependencies and runtime. Hosting and image generation services are not included.",
|
||
"connectors.hyperframes.name": "HyperFrames",
|
||
"connectors.hyperframes.description": "Create HTML videos, captions and product demos.",
|
||
"connectors.hyperframes.example": "Create a 20-second product introduction with HyperFrames.",
|
||
"connectors.hyperframes.requirements": "Installs five complete skills and references, not a renderer. Rendering needs Node.js 22+, HyperFrames CLI and FFmpeg. Local speech may need Python 3.10+; online media services need separate setup and may charge fees.",
|
||
"connectors.intercom.description": "Search customer conversations, contacts and help content.",
|
||
"connectors.intercom.example": "Summarize common questions in recent customer feedback.",
|
||
"connectors.intercom.name": "Intercom",
|
||
"connectors.intercom.requirements": "US-hosted workspaces only. Requires an access token with contact, conversation and article permissions.",
|
||
"connectors.jufa.description": "Find court cases and summarize judicial reasoning.",
|
||
"connectors.jufa.example": "Find construction contract cases and cite case numbers, courts and reasoning.",
|
||
"connectors.jufa.name": "Jufa Cases",
|
||
"connectors.jufa.requirements": "Requires a Jufa Agent API Key. This connector covers case research; other topics need separate integration. Plan and call quotas apply.",
|
||
"connectors.kuaicha.description": "Research company registrations, operations and risks.",
|
||
"connectors.kuaicha.example": "Check a company’s registration and business exceptions, identifying missing data.",
|
||
"connectors.kuaicha.name": "THS Kuaicha",
|
||
"connectors.kuaicha.requirements": "Requires a Kuaicha API Key. Only mainland China IP addresses are supported. Account permissions and quotas apply.",
|
||
"connectors.listinggood.description": "Review Amazon listings for compliance and readability.",
|
||
"connectors.listinggood.example": "Review the Amazon listing text I provide and suggest improvements.",
|
||
"connectors.listinggood.name": "ListingGood",
|
||
"connectors.listinggood.requirements": "Requires a ListingGood China API Key. China and global keys are not interchangeable. Paid tools consume account quota.",
|
||
"connectors.mcp-builder.name": "MCP builder",
|
||
"connectors.mcp-builder.description": "Build and evaluate MCP servers with TypeScript and Python references.",
|
||
"connectors.mcp-builder.example": "Design an MCP server for our internal knowledge base.",
|
||
"connectors.mcp-builder.requirements": "Includes design references and evaluation scripts. Development needs Node.js or Python and an MCP SDK. Model evaluations and third-party APIs require user-provided credentials and may incur charges.",
|
||
"connectors.miro.description": "Review collaborative boards and organize design discussions.",
|
||
"connectors.miro.example": "Summarize the ideas and action items on a Miro board I choose.",
|
||
"connectors.miro.name": "Miro",
|
||
"connectors.miro.requirements": "Requires a Miro account and board access. Organization administrators may need to enable MCP.",
|
||
"connectors.neon.description": "Inspect database projects, branches and development schemas.",
|
||
"connectors.neon.example": "Inspect my Neon development database schema without changing data.",
|
||
"connectors.neon.name": "Neon",
|
||
"connectors.neon.requirements": "Requires a Neon API Key and project access. The provider recommends development and test databases.",
|
||
"connectors.obsidian.name": "Obsidian toolkit",
|
||
"connectors.obsidian.description": "Edit Markdown notes, Canvas boards and Bases views.",
|
||
"connectors.obsidian.example": "Turn these project notes into an Obsidian Canvas relationship map.",
|
||
"connectors.obsidian.requirements": "Local file editing needs no cloud account. CLI operations require Obsidian to be installed and running. Optional extraction and templating features need their own CLIs. Only skill files are installed.",
|
||
"connectors.postman.description": "Find API workspaces, collections and development resources.",
|
||
"connectors.postman.example": "Find login-related APIs in my Postman workspace.",
|
||
"connectors.postman.name": "Postman",
|
||
"connectors.postman.requirements": "Authorize a US-region Postman account in the browser. This connector uses the minimal tool set; EU accounts need a separate API-key configuration.",
|
||
"connectors.qcc.description": "Look up companies and verify registration information.",
|
||
"connectors.qcc.example": "Find registration information for a company I specify and cite sources.",
|
||
"connectors.qcc.name": "Qichacha",
|
||
"connectors.qcc.requirements": "Requires a Qichacha Agent API Key. This connector covers basic company information only; other topics require separate integration. Account permissions and credits apply.",
|
||
"connectors.qingflow.description": "Query workspace apps and business data for workflow collaboration.",
|
||
"connectors.qingflow.example": "Review accessible Qingflow apps and summarize pending work.",
|
||
"connectors.qingflow.name": "Qingflow",
|
||
"connectors.qingflow.requirements": "Requires a Qingflow account with browser authorization. Workspace and app permissions apply; capabilities depend on the plan.",
|
||
"connectors.qveris.description": "Discover data tools for information research.",
|
||
"connectors.qveris.example": "Find company research tools in QVeris and explain parameters and costs without running them.",
|
||
"connectors.qveris.name": "QVeris",
|
||
"connectors.qveris.requirements": "Requires a QVeris API Key. Available tools and costs are provider-controlled. Reconnect after changing the key.",
|
||
"connectors.remotion.name": "Remotion",
|
||
"connectors.remotion.description": "Create programmatic videos with React, including animation, audio, captions and rendering.",
|
||
"connectors.remotion.example": "Make a 20-second Remotion product video with captions and music.",
|
||
"connectors.remotion.requirements": "Installs 12 official Remotion skills and references, not the runtime or renderer. Creating and rendering videos needs project dependencies, Node.js and a browser. The Remotion runtime has separate license terms.",
|
||
"connectors.render.description": "Review deployed services, databases, logs and metrics.",
|
||
"connectors.render.example": "Review recent Render service logs and summarize errors.",
|
||
"connectors.render.name": "Render",
|
||
"connectors.render.requirements": "Requires a Render API Key. Select a workspace first. The key accesses workspaces you belong to; deployments require an explicit task.",
|
||
"connectors.sorftime.description": "Research cross-border commerce, products and keywords.",
|
||
"connectors.sorftime.example": "Research a product’s market trends with marketplace, dates and data sources.",
|
||
"connectors.sorftime.name": "Sorftime",
|
||
"connectors.sorftime.requirements": "Requires Sorftime MCP activation and an Account-SK. Purchased services determine platforms, marketplaces and query limits.",
|
||
"connectors.todoist.description": "Review tasks, projects and personal schedules.",
|
||
"connectors.todoist.example": "List my overdue Todoist tasks and tasks due today.",
|
||
"connectors.todoist.name": "Todoist",
|
||
"connectors.todoist.requirements": "Requires a Todoist account with browser authorization for tasks and projects.",
|
||
"connectors.variflight.description": "Look up flight status, airports and travel information.",
|
||
"connectors.variflight.example": "Check a flight’s scheduled time and current status with a query timestamp.",
|
||
"connectors.variflight.name": "VariFlight",
|
||
"connectors.variflight.requirements": "Sign in to the VariFlight MCP platform to generate an MCP Key. Personal itineraries need account access; provider quotas and data limits apply.",
|
||
"connectors.webapp-testing.name": "Web app testing",
|
||
"connectors.webapp-testing.description": "Inspect local web pages, interactions and screenshots with Playwright.",
|
||
"connectors.webapp-testing.example": "Check form validation and layout in my local app.",
|
||
"connectors.webapp-testing.requirements": "Includes the testing skill, Python helpers and examples. Running tests needs Python, Playwright, a browser and the target app. Installation does not download browsers.",
|
||
"connectors.webflow.description": "Read website structure, CMS content and design context.",
|
||
"connectors.webflow.example": "Inspect CMS collections and fields on my Webflow site.",
|
||
"connectors.webflow.name": "Webflow",
|
||
"connectors.webflow.requirements": "Requires a Webflow account with site access. OAuth installs the MCP Bridge App; Designer operations require the bridge connection.",
|
||
"connectors.xmind.description": "Read and organize online mind maps for planning.",
|
||
"connectors.xmind.example": "List recent online Xmind maps and summarize the one I select.",
|
||
"connectors.xmind.name": "Xmind",
|
||
"connectors.xmind.requirements": "Requires a mainland China Xmind account with browser authorization. Only authorized team maps are accessible; editing depends on the plan.",
|
||
"connectors.toolsRemoveInfo": "Remove this tool plugin and its skill files. Existing tasks and output files are kept.",
|
||
"connectors.collection": "Catalog type",
|
||
"connectors.services": "Service connectors",
|
||
"connectors.tools": "Tool plugins",
|
||
"connectors.region": "Service region",
|
||
"connectors.region.all": "All regions",
|
||
"connectors.region.china": "China services",
|
||
"connectors.region.global": "Global services",
|
||
"connectors.toolKind": "Tool plugin",
|
||
"connectors.toolsSubtitle": "Add focused skills and working methods to your tasks.",
|
||
"connectors.skillsLoaded": "Skills loaded",
|
||
"connectors.skillsPending": "Skills not loaded",
|
||
"connectors.verifySkills": "Verify skills",
|
||
"connectors.skillsRuntimeInfo": "This installs a skill package. Node.js, command-line tools, or other runtimes required by a task must be available separately. Loaded skills do not mean those dependencies are installed.",
|
||
"connectors.saveAndVerify": "Save and verify",
|
||
"connectors.needsService": "Needs service connection",
|
||
|
||
"connectors.jinshuju.name": "Jinshuju",
|
||
"connectors.jinshuju.description": "Review forms and collected responses for analysis.",
|
||
"connectors.jinshuju.example": "Summarize recently collected questionnaire responses in Jinshuju.",
|
||
"connectors.jinshuju.requirements": "Requires a Jinshuju account. Authorize form and data access in the browser.",
|
||
"connectors.tencent-docs.name": "Tencent Docs",
|
||
"connectors.tencent-docs.description": "Read and organize online documents and spreadsheets.",
|
||
"connectors.tencent-docs.example": "Find project planning materials in Tencent Docs.",
|
||
"connectors.tencent-docs.requirements": "Requires a Tencent Docs MCP access token. Only documents already accessible to the account can be used.",
|
||
"connectors.pkulaw.name": "PKULaw",
|
||
"connectors.pkulaw.description": "Search laws and regulations with original sources.",
|
||
"connectors.pkulaw.example": "Find legal provisions on employment probation periods and cite the sources.",
|
||
"connectors.pkulaw.requirements": "Requires a PKULaw MCP access token and access to the relevant materials. Check whether retrieved provisions are currently effective.",
|
||
"connectors.datayes.name": "Datayes",
|
||
"connectors.datayes.description": "Retrieve stock prices and financial market data for research.",
|
||
"connectors.datayes.example": "Find historical prices for a stock I specify and record the data sources.",
|
||
"connectors.datayes.requirements": "Requires a Datayes MCP Token. Data access depends on account permissions and quota. Enterprise accounts must meet the provider’s verification requirements.",
|
||
"connectors.tencent-search.name": "Tencent Cloud Search",
|
||
"connectors.tencent-search.description": "Search web resources with traceable sources.",
|
||
"connectors.tencent-search.example": "Research the development of China’s low-altitude economy and collect official sources.",
|
||
"connectors.tencent-search.requirements": "Requires Tencent Cloud WSA service activation and an API Key. Account quotas and billing rules apply.",
|
||
"connectors.connectService": "Connect service",
|
||
"connectors.officialMcp": "Official MCP service",
|
||
|
||
"connectors.amap.name": "Amap",
|
||
"connectors.amap.description": "Search places, plan routes and check travel information.",
|
||
"connectors.amap.example": "Plan a public transit route from Hangzhou East Station to West Lake.",
|
||
"connectors.amap.requirements": "Requires an Amap Web Service API Key. Services depend on the account permissions and quota.",
|
||
"connectors.baidu-maps.name": "Baidu Maps",
|
||
"connectors.baidu-maps.description": "Geocode addresses, search nearby places and plan routes.",
|
||
"connectors.baidu-maps.example": "Find hotels and transport near Shanghai Hongqiao Station.",
|
||
"connectors.baidu-maps.requirements": "Requires a Baidu Maps server-side AK and access to the relevant services.",
|
||
"connectors.tencent-maps.name": "Tencent Maps",
|
||
"connectors.tencent-maps.description": "Look up locations, distances and travel routes.",
|
||
"connectors.tencent-maps.example": "Compare transit and driving routes from Guangzhou South Station to Canton Tower.",
|
||
"connectors.tencent-maps.requirements": "Requires a Tencent Location Service Key with WebServiceAPI permissions and quota.",
|
||
"connectors.zhipu-search.name": "Zhipu Web Search",
|
||
"connectors.zhipu-search.description": "Search Chinese webpages, news and current information with sources.",
|
||
"connectors.zhipu-search.example": "Find recent Chinese electric vehicle policies and link the original sources.",
|
||
"connectors.zhipu-search.requirements": "Requires a GLM Coding Plan API Key. Team plan keys and general platform keys are not interchangeable.",
|
||
"connectors.notion.name": "Notion",
|
||
"connectors.notion.description": "Search workspace content and organize pages and project knowledge.",
|
||
"connectors.notion.example": "Find recent project reports in Notion and summarize progress.",
|
||
"connectors.notion.requirements": "Requires a Notion account. Browser authorization only grants access to workspace content available to that account.",
|
||
"connectors.linear.name": "Linear",
|
||
"connectors.linear.description": "Find issues, projects and cycles to follow team work.",
|
||
"connectors.linear.example": "List unfinished Linear issues assigned to me.",
|
||
"connectors.linear.requirements": "Requires a Linear workspace account and project permissions. Connect through browser authorization.",
|
||
"connectors.github.name": "GitHub",
|
||
"connectors.github.description": "Search repository code, issues and pull requests.",
|
||
"connectors.github.example": "Find pull requests awaiting review in my GitHub repositories.",
|
||
"connectors.github.requirements": "Requires a GitHub Personal Access Token with permissions for the needed repositories and operations. Organization policies still apply.",
|
||
"connectors.context7.name": "Context7",
|
||
"connectors.context7.description": "Find current library documentation and usage examples.",
|
||
"connectors.context7.example": "Find React useEffect documentation and cleanup function examples.",
|
||
"connectors.context7.requirements": "Uses the official anonymous access allowance. Access is limited and the service may return quota errors.",
|
||
"connectors.sentry.name": "Sentry",
|
||
"connectors.sentry.description": "Inspect errors, issues and application runtime information.",
|
||
"connectors.sentry.example": "Summarize errors first seen in Sentry during the last day.",
|
||
"connectors.sentry.requirements": "Requires a Sentry account with organization and project permissions. Connect through browser authorization.",
|
||
"connectors.tavily.name": "Tavily",
|
||
"connectors.tavily.description": "Search webpages and extract content for research.",
|
||
"connectors.tavily.example": "Compare open-source vector databases and cite sources.",
|
||
"connectors.tavily.requirements": "Requires a Tavily API Key. Calls use the account subscription and quota.",
|
||
"connectors.exa.name": "Exa",
|
||
"connectors.exa.description": "Discover related webpages, code and technical resources.",
|
||
"connectors.exa.example": "Find technical articles about observability in distributed systems.",
|
||
"connectors.exa.requirements": "Uses the official basic anonymous allowance. Available tools and usage limits are set by the provider.",
|
||
"connectors.supabase.name": "Supabase",
|
||
"connectors.supabase.description": "Inspect projects, database schemas and development resources.",
|
||
"connectors.supabase.example": "Inspect the tables in my Supabase project without changing data.",
|
||
"connectors.supabase.requirements": "Requires a Supabase account with organization and project access. Database writes still require an explicit task instruction.",
|
||
"connectors.huggingface.name": "Hugging Face",
|
||
"connectors.huggingface.description": "Discover models, datasets and machine learning research.",
|
||
"connectors.huggingface.example": "Find public models and datasets for Chinese text classification.",
|
||
"connectors.huggingface.requirements": "Requires a Hugging Face token. Read permissions are recommended for search; compute tasks may incur separate charges.",
|
||
"connectors.canva.name": "Canva",
|
||
"connectors.canva.description": "Find design assets and collaborate on design content.",
|
||
"connectors.canva.example": "Find recent brand design assets in Canva.",
|
||
"connectors.canva.requirements": "Each user authorizes their own Canva account. Some capabilities depend on subscription and team permissions.",
|
||
"connectors.figma.name": "Figma",
|
||
"connectors.figma.description": "Read design context, components and interface structure.",
|
||
"connectors.figma.example": "Analyze the components in a Figma design link I provide.",
|
||
"connectors.figma.requirements": "Requires Figma account authorization. Design access, seats and plan determine available tools and usage.",
|
||
"connectors.stripe.name": "Stripe",
|
||
"connectors.stripe.description": "Find customer, billing and payment business information.",
|
||
"connectors.stripe.example": "Review recent Stripe invoices without creating payments or refunds.",
|
||
"connectors.stripe.requirements": "Requires Stripe account authorization. The official service is in preview; payments, refunds and other writes need explicit task instructions.",
|
||
"connectors.category.legal": "Legal",
|
||
|
||
"connectors.categories": "Service categories",
|
||
"connectors.allCategories": "Featured",
|
||
"connectors.category.office": "Office",
|
||
"connectors.category.development": "Development",
|
||
"connectors.category.search": "Search",
|
||
"connectors.category.maps": "Maps",
|
||
"connectors.category.data": "Data",
|
||
"connectors.category.design": "Design",
|
||
"connectors.category.productivity": "Productivity",
|
||
"connectors.category.finance": "Finance",
|
||
"connectors.kind": "Connector",
|
||
"connectors.loadFailed": "Could not complete the action",
|
||
"connectors.emptyAdded": "Add your workplace services to manage accounts and connections here.",
|
||
"connectors.emptySearch": "Try another keyword or category.",
|
||
"connectors.resetFilters": "View all",
|
||
"connectors.configuration": "Connection settings",
|
||
"connectors.configurationHint": "Leave blank to keep saved settings. Enter new settings, then choose Save and verify to validate the connection.",
|
||
"connectors.fieldRequired": "This field is required",
|
||
"connectors.capabilities": "Capabilities",
|
||
"connectors.remoteExample": "Use {name} to find information I can access.",
|
||
"connectors.remoteRequirements": "A service account and the required access permissions may be needed. Available operations depend on the provider’s granted permissions.",
|
||
|
||
"connectors.phase.installing-plugin": "Installing companion skills",
|
||
"connectors.phase.checking": "Checking account connection",
|
||
"connectors.phase.enabling-plugin": "Enabling companion skills",
|
||
"connectors.phase.refreshing-sessions": "Refreshing task capabilities",
|
||
"connectors.phase.verifying-runtime": "Checking local runtime",
|
||
"connectors.phase.persistence": "Saving connection state",
|
||
"connectors.phase.cancelling": "Cancelling operation",
|
||
"connectors.feishu.requirements": "Requires a Feishu user account and calendar access. Available capabilities depend on permissions granted to the account and app.",
|
||
"connectors.dingtalk.requirements": "Requires DingTalk OAuth login and calendar permissions granted by an enterprise administrator. Login alone does not grant all service permissions.",
|
||
"connectors.wecom.requirements": "Requires a configured WeCom bot or user identity and calendar permissions. Available operations depend on permissions granted to that identity.",
|
||
|
||
"connectors.update": "Update",
|
||
"connectors.updateAvailable": "Update available",
|
||
"connectors.currentAccount": "Current service account",
|
||
|
||
"connectors.phase.downloading": "Downloading runtime",
|
||
"connectors.phase.extracting": "Extracting runtime",
|
||
"connectors.phase.verifying": "Verifying runtime",
|
||
"connectors.phase.awaiting-authorization": "Waiting for account authorization",
|
||
"connectors.phase.configuring-account": "Configuring account",
|
||
"connectors.phase.authorizing": "Authorizing",
|
||
"connectors.phase.failed": "Failed stage",
|
||
"connectors.phase.skillsInfo": "Includes skills for operating this service after installation.",
|
||
|
||
'connectors.status.configured': 'Configured locally',
|
||
'connectors.localVerification': 'Service permissions will be verified on the first task invocation.',
|
||
"sidebar.connectors": "Connectors",
|
||
"connectors.subtitle": "Connect workplace services to give skills access to real capabilities.",
|
||
"connectors.filter": "Filter connectors",
|
||
"connectors.all": "All",
|
||
"connectors.added": "Added",
|
||
"connectors.search": "Search connectors",
|
||
"connectors.clear": "Clear search",
|
||
"connectors.retry": "Retry",
|
||
"connectors.loading": "Loading…",
|
||
"connectors.empty": "No matching connectors",
|
||
"connectors.details": "Details",
|
||
"connectors.start": "Start using",
|
||
"connectors.account": "Account",
|
||
"connectors.noAccount": "Account not verified",
|
||
"connectors.platforms": "Platforms",
|
||
"connectors.source": "Source",
|
||
"connectors.version": "Version",
|
||
"connectors.skills": "Companion skill plugin",
|
||
"connectors.homepage": "Project homepage",
|
||
"connectors.example": "Example",
|
||
"connectors.waiting": "Working. Complete authorization and wait for the status to update.",
|
||
"connectors.authorize": "Open authorization page",
|
||
"connectors.confirm": "Confirm action",
|
||
"connectors.continue": "Continue",
|
||
"connectors.shared": "This connector shares the local CLI account credentials. Connecting or switching accounts affects other apps using the same CLI. Confirm before continuing.",
|
||
"connectors.isolated": "Credentials are isolated within this app.",
|
||
"connectors.removeInfo": "Remove the app-managed connector while preserving shared account credentials.",
|
||
"connectors.invalidUrl": "Invalid authorization URL",
|
||
"connectors.openFailed": "Could not open the link. Try again.",
|
||
"connectors.startFailed": "Could not create a task. Try again.",
|
||
"connectors.unsupported": "Platform unsupported",
|
||
"connectors.action.prepare": "Add",
|
||
"connectors.action.authenticate": "Connect account",
|
||
"connectors.action.check": "Check connection",
|
||
"connectors.action.deactivate": "Deactivate",
|
||
"connectors.action.remove": "Remove",
|
||
"connectors.status.not-installed": "Not added",
|
||
"connectors.status.preparing": "Preparing",
|
||
"connectors.status.needs-auth": "Needs account",
|
||
"connectors.status.authorizing": "Authorizing",
|
||
"connectors.status.ready": "Ready",
|
||
"connectors.status.disabled": "Disabled",
|
||
"connectors.status.error": "Needs attention",
|
||
"connectors.feishu.name": "Feishu",
|
||
"connectors.dingtalk.name": "DingTalk",
|
||
"connectors.wecom.name": "WeCom",
|
||
"connectors.feishu.description": "Manage Feishu documents, calendars and workplace collaboration.",
|
||
"connectors.dingtalk.description": "Connect DingTalk schedules and team services.",
|
||
"connectors.wecom.description": "Work with your team through WeCom.",
|
||
"connectors.feishu.example": "List my Feishu calendar events for today.",
|
||
"connectors.dingtalk.example": "List my DingTalk calendar events for today.",
|
||
"connectors.wecom.example": "Show the available features for my WeCom account.",
|
||
"h5Settings.credentialRequired": "When changing a request URL, enter the model or image API key again. Keys saved on the computer cannot be sent automatically to a new address.",
|
||
"h5Settings.scope": "Model and agent settings apply to the connected computer. Desktop administration and remote-access controls remain on the desktop.",
|
||
"h5Settings.providerPrivacy": "Saved API keys are never shown here. Leave the key blank when editing to keep it, or enter a replacement. Official account sign-in and connection testing are available on the desktop.",
|
||
"h5Settings.browserOnly": "Appearance and interface language apply only to this browser.",
|
||
"h5Settings.agentPreferences": "Agent preferences",
|
||
"h5Settings.agentPreferencesHint": "These defaults are shared with the desktop. Existing sessions may keep their current behavior until restarted.",
|
||
"h5Settings.effort": "Reasoning effort",
|
||
"h5Settings.sendBehavior": "Keyboard send behavior",
|
||
"h5Settings.enter": "Enter sends · Shift+Enter inserts a line",
|
||
"h5Settings.modifierEnter": "Ctrl/Cmd+Enter sends · Enter inserts a line",
|
||
|
||
"publicAccess.title": "Public access · ngrok",
|
||
"publicAccess.intro": "Connect your own ngrok account once, then scan to use this computer from your phone.",
|
||
"publicAccess.account": "Get ngrok Authtoken",
|
||
"publicAccess.token": "ngrok Authtoken",
|
||
"publicAccess.tokenSaved": "Credential saved · enter to replace",
|
||
"publicAccess.unconfigured": "Not configured",
|
||
"publicAccess.disabled": "Off",
|
||
"publicAccess.connecting": "Connecting…",
|
||
"publicAccess.online": "Online",
|
||
"publicAccess.reconnecting": "Reconnecting…",
|
||
"publicAccess.failed": "Connection failed",
|
||
"publicAccess.authError": "Authentication failed. Check your ngrok Authtoken.",
|
||
"publicAccess.quotaError": "Your ngrok account reached a limit. Check your dashboard.",
|
||
"publicAccess.networkError": "Network unavailable. Check this computer’s connection.",
|
||
"publicAccess.configurationError": "Could not configure the tunnel. Check your ngrok account.",
|
||
"publicAccess.enable": "Enable public access",
|
||
"publicAccess.disable": "Turn off",
|
||
"publicAccess.deleteCredential": "Remove credential",
|
||
"publicAccess.autoStart": "Restore public access when the desktop starts",
|
||
"publicAccess.freeNotice": "The free plan has traffic and request limits. Phones may show an ngrok notice page; tap through to continue.",
|
||
"publicAccess.genericError": "The action failed. Please retry.",
|
||
"publicAccess.copy": "Copy address",
|
||
"publicAccess.pairPhone": "Connect a phone",
|
||
"publicAccess.qrAlt": "Scan to pair this phone",
|
||
"publicAccess.qrHint": "Valid for 5 minutes and one use. Confirm the phone on this desktop.",
|
||
"publicAccess.pending": "Pairing request",
|
||
"publicAccess.approve": "Approve",
|
||
"publicAccess.reject": "Reject",
|
||
"publicAccess.devices": "Paired devices",
|
||
"publicAccess.revoke": "Revoke",
|
||
"publicAccess.privacyTitle": "Security and privacy",
|
||
"publicAccess.consent": "Agree and enable public access",
|
||
"publicAccess.phoneIntro": "Name this browser, then request approval on your desktop.",
|
||
"publicAccess.phonePending": "Waiting for approval on your desktop…",
|
||
"publicAccess.phoneError": "Connection or pairing failed. Retry, or scan a new code from the desktop.",
|
||
"publicAccess.phoneUnpaired": "Open a new pairing QR code on your desktop and scan it.",
|
||
"publicAccess.deviceName": "Device name",
|
||
"publicAccess.requestPair": "Request pairing",
|
||
"publicAccess.privacy": "Once enabled, paired phones can view conversations, send instructions and respond to approvals over the internet. They can also add, edit, delete and switch model provider configurations and API keys, and change selected General settings. Operations run on this computer.\nYour ngrok account provides the connection. Standard HTTPS tunnels decrypt traffic at ngrok, so ngrok can technically access conversations, instructions, files, model configurations and newly submitted API keys sent through the tunnel. This is not end-to-end encryption that hides content from the relay.\nThe Authtoken is stored in this computer’s application data directory. Someone with access to your local account or administrator privileges may read it. Protect your account and pairing information.\nThe computer must stay running, online and awake. Free-plan traffic limits, request quotas and browser notice pages may affect access. You can turn off public access or revoke a phone at any time.",
|
||
|
||
'settings.providers.compatibilityJsonHint': 'requestCompatibility is saved only for this provider, separately from global settings.',
|
||
'settings.providers.compatibilityBudget': 'Reply output budget',
|
||
'settings.providers.compatibilityBudgetHint': 'Maximum output tokens requested for ordinary replies. Leave blank for automatic selection; short background requests keep their smaller budgets.',
|
||
'settings.providers.compatibilityAdvanced': 'Advanced compatibility',
|
||
'settings.providers.compatibilityReset': 'Reset compatibility',
|
||
'settings.providers.compatibilityLimit': 'Known endpoint output limit',
|
||
'settings.providers.compatibilityLimitHint': 'Set only when the provider documents a hard limit. This caps the requested budget.',
|
||
'settings.providers.compatibilityTokenField': 'Output token field',
|
||
'settings.providers.compatibilityAuto': 'Automatic',
|
||
'settings.providers.compatibilityUnknown': 'Unknown',
|
||
'settings.providers.compatibilitySupported': 'Supported',
|
||
'settings.providers.compatibilityUnsupported': 'Unsupported',
|
||
'settings.providers.compatibilityOmit': 'Do not send a limit',
|
||
'settings.providers.compatibilitySampling': 'Sampling parameters',
|
||
'settings.providers.compatibilityReasoning': 'Reasoning parameters',
|
||
'settings.providers.compatibilityParallelTools': 'Parallel tool calls',
|
||
'settings.providers.compatibilityStructuredOutput': 'Structured output',
|
||
'settings.providers.compatibilityNumberError': 'Use a positive whole number or leave blank for automatic selection.',
|
||
'settings.providers.compatibilityJsonError': 'Request compatibility must be an object with valid option values.',
|
||
'sidebar.projectHistoryFailed': 'Could not load earlier sessions.',
|
||
// ─── Common ──────────────────────────────────────
|
||
'common.cancel': 'Cancel',
|
||
'common.close': 'Close',
|
||
'common.save': 'Save',
|
||
'common.delete': 'Delete',
|
||
'common.add': 'Add',
|
||
'common.run': 'Run',
|
||
'common.send': 'Send',
|
||
'common.stop': 'Stop',
|
||
'common.tokens': '{count} tokens',
|
||
'common.rename': 'Rename',
|
||
'common.retry': 'Retry',
|
||
'common.loading': 'Loading...',
|
||
'common.select': 'Select',
|
||
'common.enable': 'Enable',
|
||
'common.disable': 'Disable',
|
||
'common.active': 'ACTIVE',
|
||
'common.error': 'Error',
|
||
'common.clearSearch': 'Clear search',
|
||
'common.copyFailed': 'Copy failed.',
|
||
'common.copied': 'Copied',
|
||
'h5Connect.failed': 'Unable to connect to the H5 server.',
|
||
'h5Connect.submit': 'Connect',
|
||
'h5Connect.token': 'H5 Token',
|
||
'h5Connect.serverUrl': 'Server URL',
|
||
'h5Connect.subtitle': 'Enter the server URL and H5 access token from the desktop app.',
|
||
'h5Connect.title': 'Connect to H5 Access',
|
||
'attachments.selectionNoteTitle': 'Requested changes',
|
||
'attachments.selectionBatch': '{count} selected page changes',
|
||
'attachments.selectionItem': 'Selected element {number}: {name}',
|
||
'chat.capabilities.managePlugins': 'Manage plugins',
|
||
'chat.capabilities.moreTools': 'More tools',
|
||
'chat.referenceSearchHint': "Type to find sessions, skills, plugins and project files",
|
||
'chat.slashFrequent': 'Frequent commands',
|
||
'chat.slashSearchHint': 'Type to search commands, skills and plugins',
|
||
'chat.slashSearchResults': 'Search results',
|
||
'chat.pendingMessageQueuedLabel': 'Queued',
|
||
'repoLaunch.worktreeIsolatedDesc': 'Create an isolated worktree for this session; experiment safely without touching {branch} until merge.',
|
||
'repoLaunch.worktreeCurrentDesc': 'Work directly in the project directory; changes land on {branch} immediately.',
|
||
'permMode.badge.risky': 'High risk',
|
||
'permMode.badge.optIn': 'Opt-in required',
|
||
'chat.generatingDiagram': 'Generating diagram…',
|
||
'chat.copyReply': 'Copy reply',
|
||
'chat.copyPrompt': 'Copy prompt',
|
||
'chat.teammateMessage': 'teammate message',
|
||
'chat.copyPath': 'Copy path',
|
||
'chat.toolResultImage.open': 'Open image {index} of {count}',
|
||
'chat.toolResultImage.alt': 'Image {index} of {count}',
|
||
'chat.toolResultImage.omitted': 'Images not shown: {count}',
|
||
'common.dismissNotification': 'Dismiss notification',
|
||
|
||
// ─── Sidebar ──────────────────────────────────────
|
||
'sidebar.newSession': 'New session',
|
||
'sidebar.scheduled': 'Scheduled',
|
||
'sidebar.skills': 'Skills',
|
||
'sidebar.terminal': 'Terminal',
|
||
'sidebar.settings': 'Settings',
|
||
'sidebar.searchPlaceholder': 'Search sessions...',
|
||
'sidebar.noSessions': 'No sessions yet',
|
||
'sidebar.noMatching': 'No matching sessions',
|
||
'sidebar.sessionListFailed': 'Session list failed to load',
|
||
'sidebar.refreshSessions': 'Refresh sessions',
|
||
'search.global.trigger': 'Search chats',
|
||
'search.global.placeholder': 'Search all chats…',
|
||
'search.global.recentTitle': 'Recent chats',
|
||
'search.global.noResults': 'No matches found',
|
||
'search.global.matchCount': '{count} matches',
|
||
'search.global.truncated': 'Showing first {count} chats — refine your query',
|
||
'search.global.roleUser': 'You',
|
||
'search.global.roleAssistant': 'Assistant',
|
||
'search.global.loading': 'Searching…',
|
||
'search.global.error': 'Search failed',
|
||
'search.global.close': 'Close',
|
||
'search.findInPage.title': 'Find in page',
|
||
'search.findInPage.placeholder': 'Find',
|
||
'search.findInPage.previousMatch': 'Previous match',
|
||
'search.findInPage.nextMatch': 'Next match',
|
||
'search.findInPage.close': 'Close find bar',
|
||
'sidebar.projects': 'Projects',
|
||
'sidebar.projectMenu': 'Project menu',
|
||
'sidebar.newProject': 'New project',
|
||
'sidebar.archiveAllChats': 'Archive all chats',
|
||
'sidebar.organizeSidebar': 'Organize sidebar',
|
||
'sidebar.sortCondition': 'Sort condition',
|
||
'sidebar.organizeByProject': 'By project',
|
||
'sidebar.organizeByRecentProject': 'Recent projects',
|
||
'sidebar.organizeByTime': 'By time',
|
||
'sidebar.sortByCreatedAt': 'Created time',
|
||
'sidebar.sortByUpdatedAt': 'Updated time',
|
||
'sidebar.newBlankProject': 'New blank project',
|
||
'sidebar.newBlankSession': 'New blank session',
|
||
'sidebar.projectEditor.createTitle': 'Create project',
|
||
'sidebar.projectEditor.editTitle': 'Edit project',
|
||
'sidebar.projectEditor.name': 'Project name',
|
||
'sidebar.projectEditor.nameHint': 'Up to {count} characters',
|
||
'sidebar.projectEditor.nameRequired': 'A project name is required.',
|
||
'sidebar.projectEditor.nameTooLong': 'Project names can be at most 80 characters.',
|
||
'sidebar.projectEditor.sourceFolder': 'Source folder',
|
||
'sidebar.projectEditor.sourceFolderRequired': 'Choose a source folder.',
|
||
'sidebar.projectEditor.realPath': 'Real path',
|
||
'sidebar.projectEditor.realPathHint': 'This project path is fixed and cannot be changed here.',
|
||
'sidebar.projectEditor.restoreFolderName': 'Restore folder name',
|
||
'sidebar.projectEditor.removeFromSidebar': 'Remove from sidebar',
|
||
'sidebar.projectEditor.removeFromSidebarHint': 'This only removes the project from the sidebar. Its sessions and files remain unchanged.',
|
||
'sidebar.projectEditor.create': 'Create project',
|
||
'sidebar.projectEditor.actionFailed': 'Could not save the project changes.',
|
||
'sidebar.useExistingFolder': 'Use existing folder',
|
||
'sidebar.chooseProjectFolderUnavailable': 'Folder selection is only available in the desktop app.',
|
||
'sidebar.projectActions': 'Project actions for {project}',
|
||
'sidebar.pinProject': 'Pin Project',
|
||
'sidebar.unpinProject': 'Unpin Project',
|
||
'sidebar.openInFileManager.darwin': 'Open in Finder',
|
||
'sidebar.openInFileManager.win32': 'Open in File Explorer',
|
||
'sidebar.openInFileManager.linux': 'Open in File Manager',
|
||
'sidebar.openInFileManager.default': 'Open in File Manager',
|
||
'sidebar.openInFileManagerFailed': 'Could not open the project in the file manager.',
|
||
'sidebar.openInFileManagerUnavailable': 'No file manager is available.',
|
||
'sidebar.hideProjectFromSidebar': 'Hide from Sidebar',
|
||
'sidebar.restoreProjectToSidebar': 'Restore to Sidebar',
|
||
'sidebar.restoreHiddenProjects': 'Restore hidden projects ({count})',
|
||
'sidebar.projectHidden': '{project} was hidden from the sidebar. Existing sessions were not deleted.',
|
||
'sidebar.newSessionInProject': 'New session in {project}',
|
||
'sidebar.showMoreSessions': 'Expand display',
|
||
'sidebar.showFewerSessions': 'Collapse display',
|
||
'sidebar.expandProject': 'Expand {project}',
|
||
'sidebar.collapseProject': 'Collapse {project}',
|
||
'sidebar.worktree': 'worktree',
|
||
'sidebar.sessionRunning': 'Session running',
|
||
'sidebar.sessionNeedsAttention': 'Waiting for your approval',
|
||
'sidebar.taskView': 'Task view',
|
||
'sidebar.tasks': 'Tasks',
|
||
'sidebar.taskGroup.running': 'In progress',
|
||
'sidebar.taskGroup.today': 'Today',
|
||
'sidebar.taskGroup.yesterday': 'Yesterday',
|
||
'sidebar.taskGroup.last7Days': 'Previous 7 days',
|
||
'sidebar.taskGroup.last30Days': 'Previous 30 days',
|
||
'sidebar.taskGroup.earlier': 'Earlier',
|
||
'sidebar.missingDir': 'missing dir',
|
||
'sidebar.confirmDelete': 'Delete this session? This cannot be undone.',
|
||
'sidebar.batchManage': 'Batch manage',
|
||
'sidebar.batchSelectedCount': '{count} selected',
|
||
'sidebar.batchSelectAll': 'Select all',
|
||
'sidebar.batchDeselectAll': 'Deselect all',
|
||
'sidebar.batchSelectGroup': 'Select {group}',
|
||
'sidebar.batchDeleteSelected': 'Delete selected ({count})',
|
||
'sidebar.batchDeleteConfirm': 'Delete {count} sessions? This cannot be undone.',
|
||
'sidebar.batchDeleteConfirmBody': 'The following sessions will be deleted:',
|
||
'sidebar.batchDeleteMore': '...and {count} more',
|
||
'sidebar.batchExit': 'Cancel batch mode',
|
||
'sidebar.batchDeleteSucceeded': 'Deleted {count} sessions.',
|
||
'sidebar.batchDeleteFailed': '{count} sessions could not be deleted.',
|
||
'sidebar.allProjects': 'All projects',
|
||
'sidebar.other': 'Other',
|
||
'sidebar.timeGroup.today': 'Today',
|
||
'sidebar.timeGroup.yesterday': 'Yesterday',
|
||
'sidebar.timeGroup.last7days': 'Last 7 days',
|
||
'sidebar.timeGroup.last30days': 'Last 30 days',
|
||
'sidebar.timeGroup.older': 'Older',
|
||
'sidebar.collapse': 'Collapse sidebar',
|
||
'sidebar.expand': 'Expand sidebar',
|
||
'sidebar.resize': 'Resize sidebar',
|
||
|
||
// ─── Title Bar ──────────────────────────────────────
|
||
'titlebar.code': 'Code',
|
||
'titlebar.terminal': 'Terminal',
|
||
'titlebar.history': 'History',
|
||
|
||
// ─── Open Project ──────────────────────────────────────
|
||
'openProject.openProject': 'Open project',
|
||
'openProject.openIn': 'Open in {target}',
|
||
'openProject.openFailed': 'Could not open project',
|
||
|
||
// ─── Open With ─────────────────────────────────────
|
||
'openWith.title': 'Open with',
|
||
'openWith.inAppBrowser': 'In-app browser',
|
||
'openWith.systemBrowser': 'System browser',
|
||
'openWith.systemDefault': 'Default application',
|
||
'openWith.workspacePreview': 'Workspace preview',
|
||
'openWith.openInTarget': 'Open in {target}',
|
||
'openWith.openInDefaultTarget': 'Open in {target} (default)',
|
||
'openWith.openFailed': 'Could not open {name}. The file may have been moved or deleted.',
|
||
'openWith.revealIn.darwin': 'Reveal in Finder',
|
||
'openWith.revealIn.win32': 'Reveal in File Explorer',
|
||
'openWith.revealIn.linux': 'Reveal in File Manager',
|
||
'openWith.revealIn.default': 'Reveal in File Manager',
|
||
'openWith.copyPath': 'Copy path',
|
||
'openWith.copyFileContent': 'Copy file contents',
|
||
'openWith.fileType.document': 'Document',
|
||
'openWith.fileType.web': 'Web',
|
||
'openWith.fileType.image': 'Image',
|
||
'openWith.fileType.code': 'Code',
|
||
'openWith.fileType.spreadsheet': 'Spreadsheet',
|
||
'openWith.fileType.presentation': 'Presentation',
|
||
'openWith.fileType.archive': 'Archive',
|
||
'openWith.fileType.audio': 'Audio',
|
||
'openWith.fileType.video': 'Video',
|
||
'openWith.fileType.file': 'File',
|
||
|
||
// ─── Assistant Output Targets ──────────────────────
|
||
'assistantOutputs.kind.markdown': 'Markdown',
|
||
'assistantOutputs.kind.html': 'HTML',
|
||
'assistantOutputs.kind.image': 'Image',
|
||
'assistantOutputs.kind.localhost': 'Localhost',
|
||
'assistantOutputs.moreOutputs': '+{count} more',
|
||
'assistantOutputs.open': 'Open',
|
||
'assistantOutputs.openAria': 'Open {title}',
|
||
|
||
// ─── Workspace Panel ───────────────────────────────
|
||
'workspace.changedFiles': 'Changed files',
|
||
'workspace.allFiles': 'All files',
|
||
'workspace.viewTabs': 'Workspace views',
|
||
'workspace.filterPlaceholder': 'Filter files...',
|
||
'workspace.clearFilter': 'Clear file filter',
|
||
'workspace.searching': 'Searching workspace...',
|
||
'workspace.searchResults': 'File search results',
|
||
'workspace.searchResultsTruncated': 'Showing the first {count} results. Refine your search.',
|
||
'workspace.reviewWorkspace': 'Review workspace',
|
||
'workspace.itemsCount': '{count} items',
|
||
'workspace.filteredItemsCount': '{visible} of {total} items',
|
||
'workspace.refresh': 'Refresh workspace',
|
||
'workspace.resizePanel': 'Resize workspace panel',
|
||
'workbench.close': 'Close',
|
||
'workspace.panelLabel': 'Workspace',
|
||
'workspace.tabStrip': 'Workspace tabs',
|
||
'workspace.tabClose': 'Close {title}',
|
||
'workspace.tabCloseCurrent': 'Close',
|
||
'workspace.tabCloseOthers': 'Close others',
|
||
'workspace.tabCloseRight': 'Close to the right',
|
||
'workspace.tabCloseAll': 'Close all',
|
||
'workspace.tabReopenClosed': 'Reopen closed tab',
|
||
'workspace.tabMoveToBottom': 'Move to bottom panel',
|
||
'workspace.tabMoveToSide': 'Move to workspace panel',
|
||
'workspace.pickerCancel': 'Cancel',
|
||
'workspace.tabAdd': 'Open in workspace',
|
||
'workspace.tabMenu': 'Tab actions',
|
||
'workspace.newTabTitle': 'New tab',
|
||
'workspace.reviewTabTitle': 'Review',
|
||
'workspace.terminalTabTitle': 'Terminal {n}',
|
||
'workspace.bottomPanelLabel': 'Terminal panel',
|
||
'workspace.resizeBottomPanel': 'Resize terminal panel',
|
||
'workspace.controls.toggleBottom': 'Toggle bottom panel',
|
||
'workspace.controls.toggleSide': 'Show/hide side panel',
|
||
'workspace.browser.suggestions': 'Address suggestions',
|
||
'workspace.browser.searchWeb': 'Search the web',
|
||
'workspace.browser.visitAddress': 'Go to address',
|
||
'workspace.controls.expand': 'Maximize workspace',
|
||
'workspace.controls.restore': 'Restore split view',
|
||
'workspace.controls.bottomPanel': 'Toggle bottom terminal',
|
||
'workspace.controls.sidePanel': 'Toggle workspace',
|
||
'workspace.launcher.label': 'Open in workspace',
|
||
'workspace.launcher.review': 'Review',
|
||
'workspace.launcher.terminal': 'Terminal',
|
||
'workspace.launcher.browser': 'Browser',
|
||
'workspace.launcher.files': 'Files',
|
||
'workspace.launcher.reviewNeedsGit': 'Not a Git repository',
|
||
'workspace.files.filter': 'Filter files…',
|
||
'workspace.files.tree': 'File tree',
|
||
'workspace.files.empty': 'No files',
|
||
'workspace.files.projectRoot': 'Project root',
|
||
'workspace.files.directoryMissing': 'Directory not found: {path}',
|
||
'workspace.files.directoryError': 'Unable to read directory: {path}',
|
||
'workspace.files.hidePreview': 'Hide preview',
|
||
'workspace.files.showPreview': 'Show preview',
|
||
'workspace.files.toggleTree': 'Toggle file tree',
|
||
'workspace.files.breadcrumb': 'File path',
|
||
'workspace.files.noSelection': 'No file selected',
|
||
'workspace.files.openContainingFolder': 'Open containing folder',
|
||
'workspace.files.openTitle': 'Open file',
|
||
'workspace.files.pickAFile': 'Choose a file from the tree',
|
||
'workspace.files.openWith': 'Open',
|
||
'workspace.files.watchFailed': 'File updates paused: {reason}. Refresh to retry.',
|
||
'workspace.files.watchLimit': 'Automatic updates cover the first {count} directories. Refresh other directories manually.',
|
||
'workspace.files.refreshFailed': 'Showing the last loaded version — refresh failed: {reason}',
|
||
'workspace.browser.address': 'Address',
|
||
'workspace.browser.addressPlaceholder': 'Search or enter address',
|
||
'workspace.browser.back': 'Back',
|
||
'workspace.browser.forward': 'Forward',
|
||
'workspace.browser.reload': 'Reload',
|
||
'workspace.browser.stop': 'Stop loading',
|
||
'workspace.browser.menu': 'Browser menu',
|
||
'workspace.browser.findInPage': 'Find in page',
|
||
'workspace.browser.findPlaceholder': 'Find…',
|
||
'workspace.browser.findMatches': '{index}/{total}',
|
||
'workspace.browser.findClose': 'Close find bar',
|
||
'workspace.browser.print': 'Print to PDF',
|
||
'workspace.browser.zoom': 'Zoom',
|
||
'workspace.browser.zoomIn': 'Zoom in',
|
||
'workspace.browser.zoomOut': 'Zoom out',
|
||
'workspace.browser.zoomReset': 'Reset zoom',
|
||
'workspace.browser.capture': 'Capture screenshot',
|
||
'workspace.browser.pickElement': 'Pick an element',
|
||
'workspace.browser.annotationActive': 'Annotating (Esc to exit)',
|
||
'workspace.browser.downloads': 'Downloads',
|
||
'workspace.browser.downloadsEmpty': 'No downloads yet',
|
||
'workspace.browser.revealDownload': 'Open downloaded file',
|
||
'workspace.browser.history': 'History',
|
||
'workspace.browser.historyEmpty': 'No pages visited yet',
|
||
'workspace.browser.closeOverlay': 'Close',
|
||
'workspace.browser.openExternal': 'Open in system browser',
|
||
'workspace.browser.emptyTitle': 'Start browsing',
|
||
'workspace.browser.emptyBody': 'Enter a URL to open a page',
|
||
'workspace.browser.loadFailed': 'Could not load {url}',
|
||
'workspace.browser.pageCrashed': 'The page stopped responding and was reloaded.',
|
||
'workspace.browser.pageClosed': 'The page was closed by the browser.',
|
||
'workspace.browser.retry': 'Try again',
|
||
'workspace.browser.unavailableTitle': 'The built-in browser needs the desktop app',
|
||
'workspace.browser.unavailableBody': 'This build has no native browser view, so pages open in your system browser instead.',
|
||
'workspace.terminal.restart': 'Restart terminal',
|
||
'workspace.terminal.exited': 'This terminal has exited.',
|
||
'workspace.review.sourceLabel': 'Comparison',
|
||
'workspace.review.sourceUnstaged': 'Unstaged',
|
||
'workspace.review.sourceStaged': 'Staged',
|
||
'workspace.review.sourceUncommitted': 'All uncommitted',
|
||
'workspace.review.sourceBranch': 'Branch: {ref}',
|
||
'workspace.review.unstageAll': 'Unstage all',
|
||
'workspace.review.stageHunk': 'Stage hunk',
|
||
'workspace.review.unstageHunk': 'Unstage hunk',
|
||
'workspace.review.historyUnavailable': 'This turn has no recorded file snapshot.',
|
||
'workspace.review.unified': 'Unified diff',
|
||
'workspace.review.split': 'Split diff',
|
||
'workspace.review.enableWrap': 'Enable word wrap',
|
||
'workspace.review.disableWrap': 'Disable word wrap',
|
||
'workspace.review.collapseFile': 'Collapse file diff',
|
||
'workspace.review.expandFile': 'Expand file diff',
|
||
'workspace.review.openFile': 'Open file in tab',
|
||
'workspace.review.sourceTurn': 'Turn changes',
|
||
'workspace.review.sourceCommit': 'Commit {sha}',
|
||
'workspace.review.compareBranch': 'Compare branch…',
|
||
'workspace.review.viewCommit': 'View commit…',
|
||
'workspace.review.branchReference': 'Branch reference',
|
||
'workspace.review.commitReference': 'Commit reference',
|
||
'workspace.review.refRequired': 'Enter a reference.',
|
||
'workspace.review.refUnavailable': 'Unable to load this comparison.',
|
||
'workspace.review.compare': 'Compare',
|
||
'workspace.review.resolvedBase': 'Base: {ref}',
|
||
'workspace.review.filterFiles': 'Filter files…',
|
||
'workspace.review.changeTree': 'Changed files',
|
||
'workspace.review.empty': 'No changes in this comparison',
|
||
'workspace.review.stage': 'Stage file',
|
||
'workspace.review.unstage': 'Unstage file',
|
||
'workspace.review.revert': 'Discard changes',
|
||
'workspace.review.stageAll': 'Stage all',
|
||
'workspace.review.revertAll': 'Discard all',
|
||
'workspace.review.refresh': 'Refresh',
|
||
'workspace.review.markViewed': 'Mark as viewed',
|
||
'workspace.review.viewed': 'Viewed',
|
||
'workspace.review.stale': 'The working tree changed since this was loaded. Refresh and try again.',
|
||
'workspace.review.failed': 'Git operation failed: {reason}',
|
||
'workspace.review.revertTitle': 'Discard changes?',
|
||
'workspace.review.revertBody': 'This discards working-tree changes in {count} file(s). A recoverable copy is saved first.',
|
||
'workspace.review.revertUntrackedWarning': 'Untracked files are listed separately and are never discarded in bulk.',
|
||
'workspace.review.untracked': 'Untracked',
|
||
'workspace.review.binary': 'Binary file',
|
||
'workspace.review.conflicted': 'Conflicted — whole-file actions only',
|
||
'workspace.review.notGitRepo': 'This folder is not a Git repository.',
|
||
'workspace.review.noHead': 'This repository has no commits yet.',
|
||
'workspace.review.backupSaved': 'A recoverable copy was saved to {path}',
|
||
'workspace.review.sourceTurnHint': 'Recorded file changes for the selected turn. Read-only; later workspace edits are excluded.',
|
||
'workspace.review.readOnlySource': 'This comparison is read-only.',
|
||
'workspace.review.revertDeleteTitle': 'Discard changes and delete new files?',
|
||
'workspace.review.revertTrackedBody': 'Working-tree changes will be discarded in {count} tracked file(s). A recoverable copy is saved first.',
|
||
'workspace.review.revertDeleteBody': '{count} untracked file(s) will be permanently deleted from disk. Git has never stored them, so only the copy saved first can bring them back.',
|
||
'workspace.review.revertDeleteList': 'Will be deleted: {paths}',
|
||
'workspace.review.revertDeleted': 'Deleted {count} untracked file(s). The only remaining copy is in {path}',
|
||
'workspace.review.missingWorkdir': 'The session working directory no longer exists.',
|
||
'workspace.review.refusedNoSnapshot': 'Load this comparison before changing files.',
|
||
'workspace.review.diffTruncated': 'File is too large to show a diff ({size})',
|
||
'workspace.review.statsTruncated': 'Too large to count',
|
||
'workspace.preview': 'Preview',
|
||
'workspace.loadError': 'Failed to load workspace data.',
|
||
'workspace.previewState.loading': 'Loading preview...',
|
||
'workspace.previewState.binary': 'Binary file preview is unavailable.',
|
||
'workspace.previewState.tooLarge': 'File is too large to preview.',
|
||
'workspace.previewState.missing': 'File not found.',
|
||
'workspace.imagePreviewUnavailable': 'Image preview is unavailable.',
|
||
'workspace.zoom.group': 'Zoom controls',
|
||
'workspace.zoom.in': 'Zoom in',
|
||
'workspace.zoom.out': 'Zoom out',
|
||
'workspace.zoom.fitWindow': 'Fit to window',
|
||
'workspace.zoom.fitWidth': 'Fit to width',
|
||
'workspace.openInSystemApp': 'Open in system app',
|
||
'workspace.document.loading': 'Loading document...',
|
||
'workspace.document.updating': 'Updating preview...',
|
||
'workspace.document.parseFailed': 'This document could not be displayed.',
|
||
'workspace.document.retry': 'Try again',
|
||
'workspace.document.unsupported': "This file type can't be previewed here.",
|
||
'workspace.document.outsideWorkspace': "This file is outside the workspace and can't be previewed here.",
|
||
'workspace.document.passwordProtected': "This PDF is password protected and can't be previewed here.",
|
||
'workspace.document.engineUnavailable': "The document viewer can't start in this environment.",
|
||
'workspace.document.openInBrowser': 'Open in browser',
|
||
'workspace.document.tooComplex': 'This file is too large or too complex to preview safely.',
|
||
'workspace.document.approximate.docx': 'Approximate preview: equations and some shapes may not appear. Open the original for the exact layout.',
|
||
'workspace.document.approximate.xlsx': "Shows each cell as formatted text. Charts, images and formulas aren't shown.",
|
||
'workspace.pdf.pages': 'Pages',
|
||
'workspace.pdf.pageNumber': 'Page number',
|
||
'workspace.pdf.pageOfTotal': 'Page {page} of {total}',
|
||
'workspace.pdf.pageFailed': 'This page could not be drawn.',
|
||
'workspace.sheet.tabs': 'Worksheets',
|
||
'workspace.sheet.truncated': 'Showing the first {rows} rows and {columns} columns.',
|
||
'workspace.sheet.showMoreRows': 'Show more rows',
|
||
'workspace.sheet.empty': 'This worksheet is empty.',
|
||
'workspace.previewLineLimit': 'Showing first {count} of {total} loaded lines.',
|
||
'workspace.previewAllLines': 'Showing all {total} loaded lines.',
|
||
'workspace.showAllLoadedLines': 'Show all loaded lines',
|
||
'workspace.collapsePreview': 'Collapse preview',
|
||
'workspace.addSelectionToChat': 'Add to chat',
|
||
'workspace.localComment': 'Local comment',
|
||
'workspace.commentLine': 'Comment line {line}',
|
||
'workspace.commentLineTarget': 'Line {line}',
|
||
'workspace.commentLineRangeTarget': 'Lines {start}–{end}',
|
||
'workspace.commentPlaceholder': 'Describe what should change here...',
|
||
'workspace.addCommentToChat': 'Add comment',
|
||
'workspace.diffReview.commentLineAria': 'Comment on {path} {side} line {line}',
|
||
'workspace.diffReview.editorLabel': 'Review comment',
|
||
'workspace.diffReview.submit': 'Submit',
|
||
'workspace.diffReview.submitAria': 'Submit review comment',
|
||
'workspace.diffReview.side.old': 'old',
|
||
'workspace.diffReview.side.new': 'new',
|
||
'workspace.diffReview.selectionReset': 'Selection reset: choose lines from the same side and hunk.',
|
||
'workspace.diffReview.diffChanged': 'Diff changed. Select lines again to submit this comment.',
|
||
'workspace.diffReview.collapsedSelection': 'Selection is outside the collapsed preview. Select visible lines again to submit this comment.',
|
||
'attachments.remove': 'Remove {name}',
|
||
'attachments.open': 'Open {name}',
|
||
'attachments.previousImage': 'Previous image',
|
||
'attachments.nextImage': 'Next image',
|
||
'attachments.selectionNote': 'Selection note: {note}',
|
||
'attachments.openFailed': 'Could not open {name}. The file may have been moved or deleted.',
|
||
|
||
// ─── Status Bar ──────────────────────────────────────
|
||
'status.connected': 'Connected',
|
||
'status.connecting': 'Connecting...',
|
||
'status.reconnecting': 'Reconnecting...',
|
||
'status.disconnected': 'Disconnected',
|
||
|
||
// ─── Settings ──────────────────────────────────────
|
||
'settings.title': 'Settings',
|
||
'settings.tab.providers': 'Model Settings',
|
||
'settings.tab.permissions': 'Permissions',
|
||
'settings.tab.activity': 'Token usage',
|
||
'settings.tab.general': 'General',
|
||
'settings.tab.h5Access': 'H5 Access',
|
||
'settings.tab.terminal': 'Terminal',
|
||
'settings.tab.skills': 'Skills',
|
||
'settings.tab.mcp': 'MCP',
|
||
'settings.tab.plugins': 'Plugins',
|
||
'settings.tab.pets': 'Pets',
|
||
'settings.tab.diagnostics': 'Diagnostics',
|
||
|
||
// Settings > Pets
|
||
'settings.pets.title': 'Desktop Pet',
|
||
'settings.pets.subtitle': 'A small companion that follows your active tasks and accepts follow-up messages.',
|
||
'settings.pets.enableTitle': 'Show desktop pet',
|
||
'settings.pets.enableDescription': 'Keep your selected pet in a floating desktop window.',
|
||
'settings.pets.loading': 'Loading pets…',
|
||
'settings.pets.loadError': 'Pets could not be loaded.',
|
||
'settings.pets.saveError': 'Pet preferences could not be saved.',
|
||
'settings.pets.retry': 'Retry',
|
||
'settings.pets.refresh': 'Refresh',
|
||
'settings.pets.create': 'Add pet',
|
||
'settings.pets.createTitle': 'Make your own pet',
|
||
'settings.pets.createMethodIntro': 'Pick how you want to make it. Everything happens on your own computer — nothing is uploaded, and none of your chat quota is used.',
|
||
'settings.pets.createRecommended': 'Recommended',
|
||
'settings.pets.createImageTitle': 'Use a picture you already have',
|
||
'settings.pets.createImageDescription': 'One character image is enough. It will breathe gently, float, and stir while you are busy.',
|
||
'settings.pets.createImageDetail': 'About a minute · But it will not run or wave',
|
||
'settings.pets.createImageBadge': 'Easiest',
|
||
'settings.pets.createImageHint': 'You will pick a PNG or WebP with a transparent background (32–4096 pixels per side, under 8 MB). This kind of pet only sways gently — for running, jumping and waving, go back and choose "Draw one with AI".',
|
||
'settings.pets.createImageSubmit': 'Pick a picture',
|
||
'settings.pets.createAtlasTitle': 'I already have an action sheet',
|
||
'settings.pets.createAtlasDescription': 'Import a multi-frame action sheet you have already drawn and skip the walkthrough.',
|
||
'settings.pets.createAtlasDetail': 'No maths needed · Sizes are aligned for you',
|
||
'settings.pets.createAtlasSubmit': 'Pick an action sheet',
|
||
'settings.pets.createAtlasHint': 'You will pick an action sheet 8 cells wide and 9 rows tall. The size does not have to be exact — it is sliced, rescaled and the "run left" row is mirrored for you. A finished 1536×2288 atlas also works and is kept as-is.',
|
||
'settings.pets.createAiTitle': 'Draw one with AI that runs and jumps',
|
||
'settings.pets.createAiDescription': 'Three steps: copy a prompt, let an AI draw it, pick the picture. The prompt and a reference template are ready for you.',
|
||
'settings.pets.createAiDetail': 'Around ten minutes · Needs an AI that can draw',
|
||
'settings.pets.createBack': 'Pick a different way',
|
||
'settings.pets.createId': 'Pet ID',
|
||
'settings.pets.createIdHint': 'A short English handle: lowercase letters, numbers and single hyphens, like moon-cat.',
|
||
'settings.pets.createName': 'Display name',
|
||
'settings.pets.createDescription': 'Description',
|
||
'settings.pets.createCancel': 'Cancel',
|
||
'settings.pets.createSubmit': 'Create',
|
||
'settings.pets.guide.intro': 'Three steps, about ten minutes, all on your own computer.',
|
||
'settings.pets.guide.step1Title': 'Have an AI draw an action sheet',
|
||
'settings.pets.guide.step1Body': 'Open any AI that can draw and send it everything below. Replace the two "Character" lines with whatever you want, for example "a shiba inu in a yellow hat".',
|
||
'settings.pets.guide.step1Tools': 'Nano Banana, ChatGPT image generation, Midjourney, Stable Diffusion and Jimeng all work (examples, not endorsements). If it comes out wrong, ask for a redraw, or say "keep the character, redraw row 2 only".',
|
||
'settings.pets.guide.prompt': `Draw me a game character action sheet (sprite sheet).
|
||
|
||
[Character]
|
||
A round-headed orange kitten wearing a small blue scarf, chibi
|
||
three-heads-tall proportions, 3D cartoon render, soft glossy
|
||
surface, bright cheerful colours.
|
||
(Replace these lines with your own character — the more specific the better)
|
||
|
||
[Whole image]
|
||
- Fully transparent background: no backdrop colour, no grid lines, no text, no drop shadow
|
||
- Divide the image evenly into 8 columns x 9 rows, 72 equally sized cells
|
||
- One action frame per cell, character centred with a little margin around it
|
||
- Every cell must show the same character with identical proportions, colours and art style
|
||
- Leave unused cells fully transparent
|
||
|
||
[What to draw in each row]
|
||
Row 1, first 6 cells: standing still with a gentle breathing bob
|
||
Row 2, all 8 cells: a full run cycle facing right, always facing right
|
||
Row 3, first 4 cells: raising a hand and waving hello
|
||
Row 4, first 5 cells: crouch, leap, land
|
||
Row 5, all 8 cells: dejected and downcast, head lowered, sighing
|
||
Row 6, first 6 cells: waiting in place, glancing around
|
||
Row 7, first 6 cells: head down, busy working
|
||
Row 8, all 8 cells: head and gaze starting straight up, turning slowly to the right through upper-right, right and lower-right, ending near straight down
|
||
Row 9, all 8 cells: continuing from straight down, turning left through lower-left, left and upper-left, back to near straight up`,
|
||
'settings.pets.guide.promptCopy': 'Copy this prompt',
|
||
'settings.pets.guide.promptCopied': 'Copied',
|
||
'settings.pets.guide.copyFailed': 'Could not copy automatically — select the text above and copy it manually.',
|
||
'settings.pets.guide.step2Title': 'Check it against the template',
|
||
'settings.pets.guide.step2Body': 'When the picture is ready, check these three things against the template below. If something is off, ask for a redraw before importing.',
|
||
'settings.pets.guide.check1': 'The background is see-through, not white — a white backdrop becomes a square on your desktop',
|
||
'settings.pets.guide.check2': '8 cells across, 9 rows down, one action per cell',
|
||
'settings.pets.guide.check3': 'The same character all the way through, with no change of face or colours',
|
||
'settings.pets.guide.templateAlt': 'Action sheet template: 8 columns by 9 rows, labelled with what each row should contain',
|
||
'settings.pets.guide.templateExpand': 'Tap the image for the full template',
|
||
'settings.pets.guide.templateCollapse': 'Tap the image to collapse',
|
||
'settings.pets.guide.saveTemplate': 'Save the template',
|
||
'settings.pets.guide.saveFailed': 'Could not save the template image. Try again shortly.',
|
||
'settings.pets.guide.step3Title': 'Just pick the file',
|
||
'settings.pets.guide.step3Body': 'Give it a name on the next page, then pick the picture you just made. You do not need to resize anything, and the "run left" row is mirrored for you.',
|
||
'settings.pets.guide.continue': 'Done drawing, next',
|
||
'settings.pets.guide.backToSteps': 'Back to the steps',
|
||
'settings.pets.createError': 'This pet could not be created.',
|
||
'settings.pets.createError.invalidId': 'Use a lowercase pet ID containing only letters, numbers, and single hyphens.',
|
||
'settings.pets.createError.duplicateId': 'A pet with this ID already exists — pick another one.',
|
||
'settings.pets.createError.unsupportedFormat': 'Choose a PNG or WebP image.',
|
||
'settings.pets.createError.imageTooLarge': 'That image is too big. Keep it under 8 MB.',
|
||
'settings.pets.createError.imageDimensions': 'The image must be 32–4096 pixels per side and contain no more than 16,777,216 pixels.',
|
||
'settings.pets.createError.atlasDimensions': 'This image cannot be sliced into 8 columns by 9 rows. Check that it is 8 cells across and 9 rows down, or use a finished 1536×2288 atlas.',
|
||
'settings.pets.createError.opaqueBackground': 'This image has no transparent background, so the pet would show up as a square on your desktop. Ask the AI to export a PNG with a transparent background (not a white one).',
|
||
'settings.pets.createError.invalidImage': 'That image could not be read. Choose a static PNG or WebP (animated files will not work).',
|
||
'settings.pets.createError.storage': 'The pet could not be saved to the local folder.',
|
||
'settings.pets.dialog.imageTitle': 'Choose a pet image with a transparent background',
|
||
'settings.pets.dialog.imageFilter': 'Pet image',
|
||
'settings.pets.dialog.atlasTitle': 'Choose a pet action sheet',
|
||
'settings.pets.dialog.atlasFilter': 'Pet action sheet',
|
||
'settings.pets.builtInTitle': 'Built-in pets',
|
||
'settings.pets.customTitle': 'Your pets',
|
||
'settings.pets.customEmpty': 'No custom pets yet.',
|
||
'settings.pets.selected': 'Selected',
|
||
'settings.pets.select': 'Select',
|
||
'settings.pets.appearanceTitle': 'Appearance',
|
||
'settings.pets.size': 'Pet size',
|
||
'settings.pets.sizeDescription': 'Adjust the pet between 96 and 192 pixels.',
|
||
'settings.pets.motion': 'Play animations',
|
||
'settings.pets.motionDescription': 'Turn off movement while keeping the pet available.',
|
||
'settings.pets.showTaskPanel': 'Show active task panel',
|
||
'settings.pets.showTaskPanelDescription': 'Show the rectangular task panel while tasks are running. It stays hidden when no task is active.',
|
||
'settings.pets.collapsed': 'Start collapsed',
|
||
'settings.pets.collapsedDescription': 'Show only the pet until you open its task panel.',
|
||
'settings.pets.folderTitle': 'Custom pet folder',
|
||
'settings.pets.folderDescription': 'Custom pet packages are stored here: ${CLAUDE_CONFIG_DIR:-~/.claude}/cc-haha/pets',
|
||
'settings.pets.openFolder': 'Open folder',
|
||
'settings.pets.openFolderError': 'The custom pet folder could not be opened.',
|
||
'settings.pets.invalidCustom': '{count} custom pet folders were skipped because they are invalid.',
|
||
'settings.pets.builtin.dada': 'A steady coding robot that helps build ideas one block at a time.',
|
||
'settings.pets.builtin.huhu': 'A pencil-and-notepad planning robot that maps a way through complex tasks.',
|
||
'settings.pets.builtin.bubu': 'A wrench-carrying repair robot with a knack for spotting and fixing cracks.',
|
||
'settings.pets.builtin.huihui': 'A gear-carrying build robot that perks up whenever a new reply arrives.',
|
||
|
||
// Desktop pet window
|
||
'pet.window.noSessions': 'No active tasks',
|
||
'pet.window.expand': 'Expand',
|
||
'pet.window.collapse': 'Collapse',
|
||
'pet.window.interact': 'Interact with pet',
|
||
'pet.window.close': 'Close pet',
|
||
'pet.window.saveError': 'Could not save the pet setting. Try again.',
|
||
'pet.window.closeError': 'Could not close the pet. Try again.',
|
||
'pet.window.status.waiting': 'Waiting for you',
|
||
'pet.window.status.failed': 'Needs attention',
|
||
'pet.window.status.review': 'Ready to review',
|
||
'pet.window.status.running': 'Working',
|
||
'pet.window.status.idle': 'Idle',
|
||
'pet.window.sessionCount': '{count} tasks',
|
||
'pet.window.expandTasks': 'Show {count} active tasks',
|
||
'pet.window.hideTasks': 'Hide {count} active tasks',
|
||
'pet.window.untitledSession': 'Untitled task',
|
||
|
||
// Settings > Usage
|
||
'settings.activity.title': 'Token usage',
|
||
'settings.activity.profileTitle': 'Profile',
|
||
'settings.activity.profilePrivacy': 'Local only',
|
||
'settings.activity.defaultHandle': 'github.com/NanmiCoder/cc-haha',
|
||
'settings.activity.editProfile': 'Edit profile',
|
||
'settings.activity.displayName': 'Display name',
|
||
'settings.activity.subtitle': 'Second line',
|
||
'settings.activity.displayNameHelper': 'Edit the display name and second line; URLs in the second line open as links.',
|
||
'settings.activity.avatar': 'Avatar',
|
||
'settings.activity.avatarHelper': 'PNG, JPEG, or WebP up to 2 MB.',
|
||
'settings.activity.changeAvatar': 'Change avatar',
|
||
'settings.activity.removeAvatar': 'Remove avatar',
|
||
'settings.activity.saveProfile': 'Save',
|
||
'settings.activity.cancelEdit': 'Cancel',
|
||
'settings.activity.profileSaved': 'Saved locally',
|
||
'settings.activity.profileSaveFailed': 'Could not save profile',
|
||
'settings.activity.subtitleLoading': 'Based on local Claude Code CLI session transcripts',
|
||
'settings.activity.totalTokens': 'Total tokens',
|
||
'settings.activity.peakTokens': 'Peak tokens',
|
||
'settings.activity.longestTask': 'Longest task',
|
||
'settings.activity.currentStreak': 'Current streak',
|
||
'settings.activity.longestStreak': 'Longest streak',
|
||
'settings.activity.noDuration': '0m',
|
||
'settings.activity.tokenActivity': 'Token Activity',
|
||
'settings.activity.mode.daily': 'Daily',
|
||
'settings.activity.mode.weekly': 'Weekly',
|
||
'settings.activity.mode.cumulative': 'Cumulative',
|
||
'settings.activity.modeHelp.daily': "Daily: each square is that day's token usage.",
|
||
'settings.activity.modeHelp.weekly': "Weekly: each column is one week's total token usage.",
|
||
'settings.activity.modeHelp.cumulative': 'Cumulative: each column is total tokens up to that week.',
|
||
'settings.activity.emptyTitle': 'No local usage yet',
|
||
'settings.activity.emptyBody': 'Start a CLI or desktop session and completed model replies will appear here.',
|
||
'settings.activity.metric.yesterday': 'Yesterday',
|
||
'settings.activity.metric.today': 'Today',
|
||
'settings.activity.metric.last4': 'Last 4 days',
|
||
'settings.activity.metric.last30': '30 days',
|
||
'settings.activity.metric.streak': 'Streak',
|
||
'settings.activity.metric.bestStreak': 'best {days} days',
|
||
'settings.activity.heatmapLabel': 'Token usage by day',
|
||
'settings.activity.weekRange': '{start} - {end}',
|
||
'settings.activity.cumulativeThrough': 'Through {date}',
|
||
'settings.activity.tokenValue': '{tokens} Tokens',
|
||
'settings.activity.count.sessionOne': '{count} session',
|
||
'settings.activity.count.sessionOther': '{count} sessions',
|
||
'settings.activity.count.dayOne': '{count} day',
|
||
'settings.activity.count.dayOther': '{count} days',
|
||
'settings.activity.count.runOne': '{count} run',
|
||
'settings.activity.count.runOther': '{count} runs',
|
||
'settings.activity.weekday.mon': 'Mon',
|
||
'settings.activity.weekday.wed': 'Wed',
|
||
'settings.activity.weekday.fri': 'Fri',
|
||
'settings.activity.selectedDay': 'Selected day',
|
||
'settings.activity.sessions': 'Sessions',
|
||
'settings.activity.tokens': 'Tokens',
|
||
'settings.activity.messages': 'Messages',
|
||
'settings.activity.tools': 'Tools',
|
||
'settings.activity.activityInsights': 'Activity insights',
|
||
'settings.activity.activeRate': 'Active rate',
|
||
'settings.activity.mostUsedModel': 'Most used model',
|
||
'settings.activity.exploredSkills': 'Skills explored',
|
||
'settings.activity.totalSkillUses': 'Skill uses',
|
||
'settings.activity.totalToolCalls': 'Tool calls',
|
||
'settings.activity.freshTokens': 'New tokens',
|
||
'settings.activity.cachedTokens': 'Cache hits',
|
||
'settings.activity.estimatedCost': 'Estimated cost',
|
||
'settings.activity.ofTotal': '{percent} of total',
|
||
'settings.activity.costExcludesModels': 'Excludes {count} unpriced models',
|
||
'settings.activity.totalSessions': 'Total sessions',
|
||
'settings.activity.mostUsedPluginsAndSkills': 'Most used plugins & skills',
|
||
'settings.activity.none': 'None',
|
||
'settings.activity.less': 'Less',
|
||
'settings.activity.more': 'More',
|
||
|
||
// Settings > Terminal
|
||
'settings.terminal.title': 'Terminal',
|
||
'settings.terminal.description': 'Run host-machine commands for plugin, skill, and MCP setup. The desktop app includes claude-haha; replace documented claude <args> with claude-haha <args>, for example: claude-haha plugin install ... or claude-haha mcp add ...',
|
||
'settings.terminal.infoLabel': 'Terminal setup help',
|
||
'settings.terminal.clear': 'Clear',
|
||
'settings.terminal.restart': 'Restart',
|
||
'settings.terminal.windowTitle': 'Host shell',
|
||
'settings.terminal.unavailableTitle': 'Desktop runtime required',
|
||
'settings.terminal.unavailableBody': 'Open this page in the packaged desktop app to start an interactive terminal.',
|
||
'settings.terminal.preferencesTitle': 'Startup shell',
|
||
'settings.terminal.preferencesBody': 'Use for new terminal sessions and after restart.',
|
||
'settings.terminal.startupShell': 'Startup shell',
|
||
'settings.terminal.customPath': 'Custom shell path',
|
||
'settings.terminal.customPathPlaceholder': 'C:\\Program Files\\PowerShell\\7\\pwsh.exe',
|
||
'settings.terminal.customPathRequired': 'Enter a shell path before saving.',
|
||
'settings.terminal.customPathAbsolute': 'Custom shell path must be an absolute Windows path.',
|
||
'settings.terminal.saveShell': 'Save shell',
|
||
'settings.terminal.saveShellSuccess': 'Saved. Restart or open a new terminal to apply it.',
|
||
'settings.terminal.shell.system': 'System default',
|
||
'settings.terminal.shell.systemDesc': 'Keep the current COMSPEC-based behavior.',
|
||
'settings.terminal.shell.pwsh': 'PowerShell 7 (pwsh)',
|
||
'settings.terminal.shell.pwshDesc': 'Use pwsh.exe when it is installed.',
|
||
'settings.terminal.shell.powershell': 'Windows PowerShell',
|
||
'settings.terminal.shell.powershellDesc': 'Use the built-in powershell.exe.',
|
||
'settings.terminal.shell.cmd': 'Command Prompt',
|
||
'settings.terminal.shell.cmdDesc': 'Use cmd.exe explicitly.',
|
||
'settings.terminal.shell.custom': 'Custom executable',
|
||
'settings.terminal.shell.customDesc': 'Launch an absolute shell executable path.',
|
||
'settings.terminal.status.idle': 'Idle',
|
||
'settings.terminal.status.starting': 'Starting',
|
||
'settings.terminal.status.running': 'Running',
|
||
'settings.terminal.status.exited': 'Exited',
|
||
'settings.terminal.status.error': 'Error',
|
||
'settings.terminal.status.unavailable': 'Unavailable',
|
||
'settings.terminal.bashPathLabel': 'Bash Path',
|
||
'settings.terminal.bashPathDescription': 'Windows defaults to CMD as the terminal shell. If tool calls use Unix commands (grep, sed, etc.), configure the path to a Bash executable here (e.g., Git Bash).',
|
||
'settings.terminal.bashPathSave': 'Save',
|
||
'settings.terminal.bashPathReset': 'Reset to default',
|
||
'settings.terminal.bashPathSaved': 'Saved',
|
||
'settings.terminal.bashPathInvalid': 'Path does not exist. Select a valid Bash executable.',
|
||
'settings.terminal.bashPathBrowse': 'Browse for a Bash executable',
|
||
'terminal.newTab': 'New Terminal',
|
||
'terminal.openInTab': 'Open in Tab',
|
||
'terminal.closePanel': 'Close terminal panel',
|
||
'terminal.resizePanel': 'Resize terminal panel',
|
||
|
||
// Settings > Diagnostics
|
||
'settings.diagnostics.title': 'Diagnostics',
|
||
'settings.diagnostics.description': 'Server and CLI runtime logs for debugging startup, provider, and session failures.',
|
||
'settings.diagnostics.refresh': 'Refresh',
|
||
'settings.diagnostics.totalSize': 'Log size',
|
||
'settings.diagnostics.events': 'Events',
|
||
'settings.diagnostics.completeEvents': 'Complete events',
|
||
'settings.diagnostics.completeEventsValue': '{count} complete events',
|
||
'settings.diagnostics.visibleEvents': 'Visible events',
|
||
'settings.diagnostics.visibleEventsValue': '{count} visible events',
|
||
'settings.diagnostics.corruptLinesWarning': 'Detected or retained evidence of {count} corrupt diagnostic records. Current diagnostic files contain {physical} physical lines. Event totals and recent history may be incomplete.',
|
||
'settings.diagnostics.storageLimitExceededWarning': 'One or more diagnostic surfaces or active writers temporarily exceed their own retention target. Cleanup will occur as their segments close or age out.',
|
||
'settings.diagnostics.recentErrors': '24h warnings',
|
||
'settings.diagnostics.retention': 'Retention',
|
||
'settings.diagnostics.retentionValue': '{days} days / {size}',
|
||
'settings.diagnostics.logDirectory': 'Log directory',
|
||
'settings.diagnostics.openDirectory': 'Open',
|
||
'settings.diagnostics.exportBundle': 'Export Bundle',
|
||
'settings.diagnostics.copySummary': 'Copy Error Summary',
|
||
'settings.diagnostics.copyIssueReport': 'Copy issue report',
|
||
'settings.diagnostics.issueReportCopied': 'Issue report copied.',
|
||
'settings.diagnostics.issueReportCopyFailed': 'Failed to copy issue report.',
|
||
'settings.diagnostics.clearLogs': 'Clear Logs',
|
||
'settings.diagnostics.recentEvents': 'Recent Events',
|
||
'settings.diagnostics.privacyNote': 'Issue reports and exported bundles use best-effort sanitization to omit chat and file contents, full environment variables, and API keys. Review them for private metadata before sharing.',
|
||
'settings.diagnostics.noEvents': 'No diagnostic events yet.',
|
||
'settings.diagnostics.noRecentErrors': 'No recent warnings or errors.',
|
||
'settings.diagnostics.loadFailed': 'Failed to load diagnostics.',
|
||
'settings.diagnostics.openFailed': 'Failed to open diagnostics directory.',
|
||
'settings.diagnostics.exportFailed': 'Failed to export diagnostics bundle.',
|
||
'settings.diagnostics.exported': 'Exported {file}',
|
||
'settings.diagnostics.summaryCopied': 'Error summary copied.',
|
||
'settings.diagnostics.copyFailed': 'Failed to copy error summary.',
|
||
'settings.diagnostics.confirmClear': 'Clear all local diagnostic logs and exported bundles?',
|
||
'settings.diagnostics.cleared': 'Diagnostics cleared.',
|
||
'settings.diagnostics.clearFailed': 'Failed to clear diagnostics.',
|
||
'settings.diagnostics.eventDetails': 'Details',
|
||
'settings.diagnostics.localIndex.title': 'Local index',
|
||
'settings.diagnostics.localIndex.description': 'A rebuildable local projection that speeds up session and diagnostics reads.',
|
||
'settings.diagnostics.localIndex.rebuild': 'Rebuild local index',
|
||
'settings.diagnostics.localIndex.confirmRebuild': 'Only the derived local index will be rebuilt. Transcripts and settings are untouched.',
|
||
'settings.diagnostics.localIndex.rebuildSucceeded': 'Local index rebuilt. Source history was not deleted.',
|
||
'settings.diagnostics.localIndex.rebuildFailed': 'Failed to rebuild the local index.',
|
||
'settings.diagnostics.localIndex.mode': 'Mode',
|
||
'settings.diagnostics.localIndex.state': 'Status',
|
||
'settings.diagnostics.localIndex.indexed': 'Indexed sources',
|
||
'settings.diagnostics.localIndex.degradedSources': 'Degraded sources',
|
||
'settings.diagnostics.localIndex.databaseSize': 'Database',
|
||
'settings.diagnostics.localIndex.walSize': 'WAL',
|
||
'settings.diagnostics.localIndex.lastUpdated': 'Last update',
|
||
'settings.diagnostics.localIndex.errorCode': 'Error code',
|
||
'settings.diagnostics.localIndex.never': 'Never',
|
||
'settings.diagnostics.localIndex.none': 'None',
|
||
'settings.diagnostics.localIndex.unavailable': 'Local-index status is unavailable. Existing diagnostics remain available.',
|
||
'settings.diagnostics.localIndex.buildingMessage': 'Indexing runs in the background. Session history remains available.',
|
||
'settings.diagnostics.localIndex.degradedMessage': 'The local index is degraded. File-based fallback remains available.',
|
||
'settings.diagnostics.localIndex.mode.off': 'Off',
|
||
'settings.diagnostics.localIndex.mode.shadow': 'Shadow',
|
||
'settings.diagnostics.localIndex.mode.on': 'On',
|
||
'settings.diagnostics.localIndex.state.off': 'Off',
|
||
'settings.diagnostics.localIndex.state.building': 'Building',
|
||
'settings.diagnostics.localIndex.state.ready': 'Ready',
|
||
'settings.diagnostics.localIndex.state.degraded': 'Degraded',
|
||
'settings.diagnostics.eventId': 'Event ID',
|
||
'settings.diagnostics.copyEventId': 'Copy event ID',
|
||
'settings.diagnostics.eventIdCopied': 'Event ID copied.',
|
||
'settings.diagnostics.eventIdCopyFailed': 'Failed to copy event ID.',
|
||
'settings.diagnostics.doctorTitle': 'Doctor',
|
||
'settings.diagnostics.doctorDescription': 'Check protected user and project state without changing it.',
|
||
'settings.diagnostics.doctorProtectedData': 'Chat history, model config, skills, MCP, IM, and OAuth remain protected.',
|
||
'settings.diagnostics.doctorSafeKeys': 'Reset removes only: cc-haha-open-tabs, cc-haha-session-runtime, cc-haha-theme, cc-haha-locale, cc-haha-app-zoom, cc-haha-ui-zoom, and cc-haha.persistence.schemaVersion.',
|
||
'settings.diagnostics.runDoctor': 'Run Doctor',
|
||
'settings.diagnostics.resetSafeUiState': 'Reset safe UI state',
|
||
'settings.diagnostics.confirmResetSafeUiState': 'Reset only the listed regenerable desktop UI keys? Protected user and project data will not be changed.',
|
||
'settings.diagnostics.doctorCheckCompleted': 'Doctor check completed.',
|
||
'settings.diagnostics.doctorResetCompleted': 'Safe UI state reset completed.',
|
||
'settings.diagnostics.doctorPartial': 'Safe UI state reset completed with {count} failed key(s).',
|
||
'settings.diagnostics.doctorFailed': 'Doctor failed.',
|
||
'settings.diagnostics.doctorScope': 'Scope',
|
||
'settings.diagnostics.doctorScopeProject': 'User and active project',
|
||
'settings.diagnostics.doctorScopeUser': 'User only',
|
||
'settings.diagnostics.doctorSummary': 'Healthy: {healthy} · Not configured: {neutral} · Missing: {missing} · Invalid: {invalid}',
|
||
'settings.diagnostics.doctorFindings': 'Doctor findings',
|
||
'settings.diagnostics.doctorNoFindings': 'No missing or invalid items found.',
|
||
'settings.diagnostics.doctorStatusHealthy': 'Healthy',
|
||
'settings.diagnostics.doctorStatusNotConfigured': 'Not configured',
|
||
'settings.diagnostics.doctorStatusMissing': 'Missing',
|
||
'settings.diagnostics.doctorStatusInvalidJson': 'Invalid JSON',
|
||
'settings.diagnostics.doctorStatusInvalidJsonl': 'Invalid JSONL',
|
||
'settings.diagnostics.doctorStatusInvalidSchema': 'Invalid schema',
|
||
'settings.diagnostics.doctorStatusUnreadable': 'Unreadable',
|
||
'settings.diagnostics.doctorRemovedKeys': 'Removed keys',
|
||
'settings.diagnostics.doctorFailedKeys': 'Failed keys',
|
||
'settings.diagnostics.doctorNoKeys': 'None',
|
||
'errorBoundary.title': 'Something went wrong.',
|
||
'errorBoundary.description': 'The error was recorded in Diagnostics.',
|
||
'errorBoundary.item': "This item couldn't be displayed. The error was recorded in Diagnostics.",
|
||
|
||
// Settings > Claude Official Login
|
||
'settings.claudeOfficialLogin.intro': 'Using official Claude models requires signing in to your Claude.ai account. Click the button below to open the official Claude login page in your browser; you\'ll be returned here after authorizing.',
|
||
'settings.claudeOfficialLogin.loginButton': 'Sign in to Claude',
|
||
'settings.claudeOfficialLogin.loginStarting': 'Opening…',
|
||
'settings.claudeOfficialLogin.logoutButton': 'Sign out',
|
||
'settings.claudeOfficialLogin.logoutProcessing': 'Processing…',
|
||
'settings.claudeOfficialLogin.loggedInPrefix': 'Signed in (Claude',
|
||
'settings.claudeOfficialLogin.subTypeUnknown': 'Unknown',
|
||
'settings.claudeOfficialLogin.errorPrefix': 'Error: ',
|
||
'settings.claudeOfficialLogin.openBrowserFailed': 'Failed to open browser; please visit the authorization URL manually.',
|
||
|
||
// Settings > ChatGPT Official Login
|
||
'settings.chatgptOfficialLogin.intro': 'Sign in with ChatGPT to use GPT models from desktop sessions.',
|
||
'settings.chatgptOfficialLogin.loginButton': 'Sign in with ChatGPT',
|
||
'settings.chatgptOfficialLogin.loginStarting': 'Starting sign-in...',
|
||
'settings.chatgptOfficialLogin.logoutButton': 'Sign out',
|
||
'settings.chatgptOfficialLogin.logoutProcessing': 'Signing out...',
|
||
'settings.chatgptOfficialLogin.loggedInPrefix': 'Signed in as',
|
||
'settings.chatgptOfficialLogin.accountUnknown': 'ChatGPT account',
|
||
'settings.chatgptOfficialLogin.openBrowserFailed': 'Unable to open browser. Copy the authorization link and open it manually.',
|
||
'settings.chatgptOfficialLogin.copyAuthorizeUrl': 'Copy authorization link',
|
||
'settings.chatgptOfficialLogin.copyLinkFailed': 'Unable to copy authorization link.',
|
||
'settings.chatgptOfficialLogin.errorPrefix': 'ChatGPT OAuth error: ',
|
||
'settings.grokOfficialLogin.intro': 'Sign in with Grok to use official Grok models from desktop sessions.',
|
||
'settings.grokOfficialLogin.loginButton': 'Sign in with Grok',
|
||
'settings.grokOfficialLogin.loginStarting': 'Starting sign-in...',
|
||
'settings.grokOfficialLogin.logoutButton': 'Sign out',
|
||
'settings.grokOfficialLogin.logoutProcessing': 'Signing out...',
|
||
'settings.grokOfficialLogin.loggedInPrefix': 'Signed in as',
|
||
'settings.grokOfficialLogin.accountUnknown': 'Grok account',
|
||
'settings.grokOfficialLogin.openBrowserFailed': 'Unable to open browser. Copy the authorization link and open it manually.',
|
||
'settings.grokOfficialLogin.copyAuthorizeUrl': 'Copy authorization link',
|
||
'settings.grokOfficialLogin.copyLinkFailed': 'Unable to copy authorization link.',
|
||
'settings.grokOfficialLogin.errorPrefix': 'Grok OAuth error: ',
|
||
|
||
// Settings > Providers
|
||
'settings.providers.title': 'Model Management',
|
||
'settings.providers.description': 'Configure models, API endpoints, and credentials.',
|
||
'settings.providers.addProvider': 'Add Model',
|
||
'settings.providers.officialName': 'Claude Official',
|
||
'settings.providers.officialDesc': 'Anthropic native — no API key required',
|
||
'settings.providers.openaiOfficialName': 'ChatGPT Official',
|
||
'settings.providers.openaiOfficialDesc': 'OpenAI OAuth via your ChatGPT account — no API key required',
|
||
'settings.providers.officialModelsTitle': 'OAuth model mapping',
|
||
'settings.providers.officialModelsDesc': 'Choose which OAuth model each Claude model alias uses. The available list comes from the signed-in provider account.',
|
||
'settings.providers.officialModelsAvailableGroup': 'Available OAuth models',
|
||
'settings.providers.officialModelsPick': 'Choose {label} from the OAuth model list',
|
||
'settings.providers.officialModelsNoMatches': 'No matching OAuth models. You can enter a model ID manually.',
|
||
'settings.providers.officialModelsSave': 'Save model mapping',
|
||
'settings.providers.officialModelsSaved': 'Model mapping saved',
|
||
'settings.providers.officialModelsLoadError': 'Could not load the OAuth model mapping.',
|
||
'settings.providers.officialModelsSaveError': 'Could not save the OAuth model mapping.',
|
||
'settings.providers.grokOfficialName': 'Grok Official',
|
||
'settings.providers.grokOfficialDesc': 'Official Grok OAuth via your xAI account — no API key required',
|
||
'settings.providers.connected': 'Connected ({latency}ms)',
|
||
'settings.providers.failed': 'Failed: {error}',
|
||
'settings.providers.connectivityOk': '① Connectivity ({latency}ms)',
|
||
'settings.providers.connectivityFailed': '① Connectivity failed: {error}',
|
||
'settings.providers.proxyOk': '② Proxy pipeline ({latency}ms)',
|
||
'settings.providers.proxyFailed': '② Proxy failed: {error}',
|
||
'settings.providers.confirmDelete': 'Delete model configuration "{name}"? This cannot be undone.',
|
||
'settings.providers.activate': 'Activate',
|
||
'settings.providers.default': 'Default',
|
||
'settings.providers.setDefault': 'Set default',
|
||
'settings.providers.test': 'Test',
|
||
'settings.providers.edit': 'Edit',
|
||
'settings.providers.dragToReorder': 'Drag to reorder',
|
||
'settings.providers.requestFailed': 'Request failed',
|
||
'settings.providers.addTitle': 'Add Model',
|
||
'settings.providers.editTitle': 'Edit Model',
|
||
'settings.providers.new': 'New',
|
||
'settings.providers.sponsor': 'Sponsor',
|
||
'settings.providers.preset': 'Preset',
|
||
'settings.providers.name': 'Configuration name',
|
||
'settings.providers.namePlaceholder': 'Configuration name',
|
||
'settings.providers.notes': 'Notes',
|
||
'settings.providers.notesPlaceholder': 'Optional notes...',
|
||
'settings.providers.baseUrl': 'Base URL',
|
||
'settings.providers.baseUrlPlaceholder': 'https://api.example.com/anthropic',
|
||
'settings.providers.baseUrlHelp': 'Base URL help',
|
||
'settings.providers.baseUrlTooltip': 'Enter the endpoint before /v1. The remaining path is added automatically.',
|
||
'settings.providers.endpointRegion': 'Service region',
|
||
'settings.providers.regionChina': 'China mainland',
|
||
'settings.providers.regionGlobal': 'Global',
|
||
'settings.providers.regionCustom': 'Custom',
|
||
'settings.providers.apiKey': 'API Key',
|
||
'settings.providers.apiKeyKeep': 'API Key (leave blank to keep current)',
|
||
'settings.providers.showApiKey': 'Show API Key',
|
||
'settings.providers.hideApiKey': 'Hide API Key',
|
||
'settings.providers.getApiKey': 'Get API Key',
|
||
'settings.providers.modelMapping': 'Model Mapping',
|
||
'settings.providers.mainModel': 'Main Model',
|
||
'settings.providers.fableModel': 'Fable Model',
|
||
'settings.providers.haikuModel': 'Haiku Model',
|
||
'settings.providers.sonnetModel': 'Sonnet Model',
|
||
'settings.providers.opusModel': 'Opus Model',
|
||
'settings.providers.model1mSupportShort': '1M',
|
||
'settings.providers.model1mSupportHint': 'Only tick “1M” when the endpoint really serves a 1M-token context — ticking it otherwise stops auto-compaction from firing.',
|
||
'settings.providers.model1mSupportTooltip': 'Declares that this model endpoint supports a 1M-token context: the model name gets a [1m] suffix and the context window is set to 1,000,000. If the endpoint is actually smaller, auto-compaction never fires and requests hit the provider’s hard context limit. Clearing the box restores the preset window.',
|
||
'settings.providers.modelIdPlaceholder': 'e.g. deepseek-v4-flash',
|
||
'settings.providers.sameAsMain': 'Same as main',
|
||
'settings.providers.fableModelPlaceholder': 'Leave blank to let Claude Code choose',
|
||
'settings.providers.contextSettingsTitle': 'Context and auto-compact',
|
||
'settings.providers.contextSettingsDesc': 'Preset limits are applied automatically. Edit only when the provider changes limits or you use a custom model ID.',
|
||
'settings.providers.contextSettingsEdit': 'Advanced',
|
||
'settings.providers.contextSettingsHide': 'Hide',
|
||
'settings.providers.contextSummaryAuto': 'Auto-detect configured models; unknown models use the built-in fallback',
|
||
'settings.providers.contextFallbackAuto': 'Unknown models: auto',
|
||
'settings.providers.contextFallbackSummary': 'Unknown models: {tokens}',
|
||
'settings.providers.modelContextWindows': 'Model context windows',
|
||
'settings.providers.mainContextWindow': 'Main model context',
|
||
'settings.providers.haikuContextWindow': 'Haiku model context',
|
||
'settings.providers.sonnetContextWindow': 'Sonnet model context',
|
||
'settings.providers.opusContextWindow': 'Opus model context',
|
||
'settings.providers.contextWindowPlaceholder': 'e.g. 200000',
|
||
'settings.providers.modelContextWindowsDesc': 'Use each model’s real context window. Presets are filled automatically; blank values fall back to built-in detection or 200K.',
|
||
'settings.providers.modelContextWindowNumberError': 'Enter an integer.',
|
||
'settings.providers.modelContextWindowRangeError': 'Must be between 16000 and 10000000.',
|
||
'settings.providers.autoCompactWindow': 'Unknown Model Fallback Window',
|
||
'settings.providers.autoCompactWindowPlaceholder': 'Optional, e.g. 200000',
|
||
'settings.providers.autoCompactWindowDesc': 'Models whose context window cannot be identified use this value directly; models with a known window use the smaller of the two, so this can only lower a window, never raise it.',
|
||
'settings.providers.autoCompactWindowNumberError': 'Enter an integer.',
|
||
'settings.providers.autoCompactWindowRangeError': 'Must be between 16000 and 10000000.',
|
||
'settings.providers.testConnection': 'Test Connection',
|
||
'settings.providers.settingsJson': 'Settings JSON',
|
||
'settings.providers.settingsJsonDesc': '~/.claude/cc-haha/settings.json — edit directly, will be written on save.',
|
||
'settings.providers.jsonError': 'JSON syntax error: {error}',
|
||
'settings.providers.apiFormat': 'API Format',
|
||
'settings.providers.apiFormatAnthropic': 'Anthropic Messages (native)',
|
||
'settings.providers.apiFormatOpenaiChat': 'OpenAI Chat Completions (proxy)',
|
||
'settings.providers.apiFormatOpenaiResponses': 'OpenAI Responses API (proxy)',
|
||
'settings.providers.multiProtocolBadge': 'Multi-protocol',
|
||
'settings.providers.apiFormatPerModelHint': 'This preset picks the protocol per model, so the choice is fixed by it',
|
||
'settings.providers.proxyHint': 'Requests will be translated via the local proxy',
|
||
'settings.providers.apiFormatOverrideHint': 'Protocol changed from the preset default — point the base URL at an endpoint that serves it',
|
||
'settings.providers.authStrategy': 'Auth Variable',
|
||
'settings.providers.authStrategyApiKey': 'API Key (ANTHROPIC_API_KEY)',
|
||
'settings.providers.authStrategyApiKeyDesc': 'Direct Anthropic API access using x-api-key.',
|
||
'settings.providers.authStrategyAuthToken': 'Bearer Token (ANTHROPIC_AUTH_TOKEN)',
|
||
'settings.providers.authStrategyAuthTokenDesc': 'Most third-party Anthropic-compatible services using Authorization Bearer.',
|
||
'settings.providers.authStrategyAuthTokenEmptyApiKey': 'Bearer + Empty API_KEY',
|
||
'settings.providers.authStrategyAuthTokenEmptyApiKeyDesc': 'OpenRouter/Ollama-style setups that must avoid falling back to an Anthropic API key.',
|
||
'settings.providers.authStrategyDualSameToken': 'Write token to both variables',
|
||
'settings.providers.authStrategyDualSameTokenDesc': 'Services such as Hugging Face Router that check both variables.',
|
||
'settings.providers.authStrategyDualDummy': 'Write dummy to both variables',
|
||
'settings.providers.authStrategyDualDummyDesc': 'Local vLLM-compatible services that only need placeholder auth values.',
|
||
'settings.providers.toolSearchEnabled': 'Enable Tool Search',
|
||
'settings.providers.toolSearchDesc': 'Off by default. Enable only when the model and final upstream support tool_reference; incompatible providers may return HTTP 400.',
|
||
'settings.providers.toolSearchUnsupported': 'Only Anthropic Messages providers support Tool Search here. OpenAI proxy formats keep full tool schemas available.',
|
||
'settings.providers.toolSearchConfirmTitle': 'Enable Tool Search?',
|
||
'settings.providers.toolSearchConfirmBody': 'Only enable this when using an Anthropic-supported Tool Search model and the final LLM upstream or gateway explicitly supports defer_loading and tool_reference.',
|
||
'settings.providers.toolSearchConfirmRisk': 'Unsupported providers, including many local and third-party compatible endpoints, may return HTTP 400 and leave the current session unable to continue.',
|
||
'settings.providers.toolSearchConfirmEnable': 'Enable anyway',
|
||
'settings.providers.disableExperimentalBetas': 'Disable experimental beta headers',
|
||
'settings.providers.disableExperimentalBetasDesc': 'Sets CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 to avoid beta API shapes that third-party gateways may reject. GPT and o-series models still receive the reasoning effort selected for the Session; other direct Anthropic-compatible models may fall back to the gateway default.',
|
||
'settings.providers.supportsNestedToolResultMedia': 'Preserve nested tool result media',
|
||
'settings.providers.nestedToolResultMediaDesc': 'Keeps images and files inside tool results when the Anthropic-compatible endpoint supports nested media. Turn this off for third-party endpoints that cannot display nested media; images and files are then lifted into standalone content blocks.',
|
||
'settings.providers.nestedToolResultMediaUnsupported': 'Only Anthropic Messages providers can configure nested tool result media.',
|
||
'settings.providers.imageGenerationEnabled': 'Enable image generation',
|
||
'settings.providers.imageGenerationEnabledDesc': 'Let chat generate images through an OpenAI-compatible Images API. Credentials stay in provider settings, not in the skill.',
|
||
'settings.providers.imageGenerationModel': 'Image model',
|
||
'settings.providers.imageGenerationModelPlaceholder': 'gpt-image-2',
|
||
'settings.providers.imageGenerationModelHint': 'Required. Use the image model ID exposed by this upstream.',
|
||
'settings.providers.imageGenerationBaseUrl': 'Image API Base URL',
|
||
'settings.providers.imageGenerationBaseUrlPlaceholder': 'https://api.example.com/v1',
|
||
'settings.providers.imageGenerationBaseUrlHint': 'Optional. Leave blank to reuse the chat provider Base URL.',
|
||
'settings.providers.imageGenerationApiKey': 'Image API key',
|
||
'settings.providers.imageGenerationApiKeyHint': 'Optional. Leave blank to reuse the chat provider API key.',
|
||
'settings.providers.fetchModels': 'Fetch models',
|
||
'settings.providers.fetchModelsHint': 'Enter the base URL first.',
|
||
'settings.providers.fetchModelsApiKeyHint': 'Enter an API key to fetch the model list.',
|
||
'settings.providers.fetchModelsSupportHint': 'This works only when the upstream provider publishes a model list endpoint.',
|
||
'settings.providers.fetchModelsLoaded': 'Model list loaded ({count}). Pick one or keep typing the ID.',
|
||
'settings.providers.fetchModelsToast': 'Model list loaded. Pick a model from the dropdown now.',
|
||
'settings.providers.fetchModelsEmpty': 'No models found. Enter the model ID manually.',
|
||
'settings.providers.fetchModelsPick': 'Choose {label} from the fetched list',
|
||
'settings.providers.fetchModelsGroupOther': 'Other',
|
||
'settings.providers.fetchModelsMoreResults': 'More models are available. Type to narrow the list.',
|
||
'settings.providers.fetchModelsErrorMissingConfig': 'Base URL and API key are required.',
|
||
'settings.providers.fetchModelsErrorAuthFailed': 'The API key was rejected. Check the key and the auth variable.',
|
||
'settings.providers.fetchModelsErrorEndpointNotFound': 'No model list endpoint was found under this base URL.',
|
||
'settings.providers.fetchModelsErrorTimeout': 'The provider did not respond in time.',
|
||
'settings.providers.fetchModelsErrorNotSupported': 'This provider does not publish a model list. Enter the model ID manually.',
|
||
'settings.providers.fetchModelsErrorNetwork': 'Could not reach the provider. Check the base URL and your network.',
|
||
'settings.providers.fetchModelsErrorUnknown': 'Could not fetch the model list.',
|
||
'settings.providers.fetchModelsErrorUpstream': 'Provider response:',
|
||
'settings.providers.ccSwitch.importButton': 'Import from cc-switch',
|
||
'settings.providers.ccSwitch.title': 'Import from cc-switch',
|
||
'settings.providers.ccSwitch.description': 'Pick the cc-switch providers to copy in. Providers you already have are left untouched.',
|
||
'settings.providers.ccSwitch.scanning': 'Reading the cc-switch configuration',
|
||
'settings.providers.ccSwitch.unavailableTitle': 'cc-switch configuration unavailable',
|
||
'settings.providers.ccSwitch.unavailableNotFound': 'No cc-switch configuration was found. Install cc-switch and add at least one provider first.',
|
||
'settings.providers.ccSwitch.unavailableUnreadable': 'The cc-switch configuration could not be read. Check its file permissions and try again.',
|
||
'settings.providers.ccSwitch.unavailableSchema': 'This cc-switch version stores its configuration in a layout cc-haha does not recognise yet. Update cc-haha, or add the provider manually.',
|
||
'settings.providers.ccSwitch.unavailableTooOld': 'This cc-switch version stores its configuration in a format that cc-switch itself no longer supports. Importing requires cc-switch v3.1.0 or newer.',
|
||
'settings.providers.ccSwitch.unavailableSqlite': 'The cc-switch database cannot be opened by this build. Add the provider manually instead.',
|
||
'settings.providers.ccSwitch.configDir': 'Config directory: {path}',
|
||
'settings.providers.ccSwitch.emptyTitle': 'Nothing to import',
|
||
'settings.providers.ccSwitch.emptyDesc': 'cc-switch was found, but it has no providers configured.',
|
||
'settings.providers.ccSwitch.selectAll': 'Select all',
|
||
'settings.providers.ccSwitch.selectNone': 'Select none',
|
||
'settings.providers.ccSwitch.selectedCount': '{selected} of {total} selected',
|
||
'settings.providers.ccSwitch.currentBadge': 'In use',
|
||
'settings.providers.ccSwitch.duplicateBadge': 'Already exists',
|
||
'settings.providers.ccSwitch.duplicateHint': 'Looks like your existing provider "{name}".',
|
||
'settings.providers.ccSwitch.appTypeClaude': 'Claude Code',
|
||
'settings.providers.ccSwitch.appTypeClaudeDesktop': 'Claude Desktop',
|
||
'settings.providers.ccSwitch.skipNoBaseUrl': 'Cannot import: no base URL.',
|
||
'settings.providers.ccSwitch.skipNoApiKey': 'Cannot import: no API key stored.',
|
||
'settings.providers.ccSwitch.skipNoModel': 'Cannot import: no model configured.',
|
||
'settings.providers.ccSwitch.skipUnsupportedFormat': 'Cannot import: unsupported API format.',
|
||
'settings.providers.ccSwitch.skipFullUrlEndpoint': 'Cannot import: base URL is a full endpoint, which is not supported.',
|
||
'settings.providers.ccSwitch.skipUnknown': 'Cannot import this provider.',
|
||
'settings.providers.ccSwitch.importAction': 'Import ({count})',
|
||
'settings.providers.ccSwitch.scanFailed': 'Could not read the cc-switch configuration.',
|
||
'settings.providers.ccSwitch.importFailed': 'Import failed.',
|
||
'settings.providers.ccSwitch.importedSummary': 'Imported {imported}, skipped {skipped}.',
|
||
|
||
// Settings > Permissions
|
||
'settings.permissions.title': 'Permission Mode',
|
||
'settings.permissions.description': 'Controls how tool execution permissions are handled.',
|
||
'settings.permissions.default': 'Ask permissions',
|
||
'settings.permissions.defaultDesc': 'Ask before executing tools',
|
||
'settings.permissions.acceptEdits': 'Accept edits',
|
||
'settings.permissions.acceptEditsDesc': 'Auto-approve file edits, ask for others',
|
||
'settings.permissions.plan': 'Plan mode',
|
||
'settings.permissions.planDesc': 'Think and plan without executing',
|
||
'settings.permissions.bypass': 'Bypass all',
|
||
'settings.permissions.bypassDesc': 'Skip all permission checks (dangerous)',
|
||
|
||
// Settings > Adapters
|
||
'settings.tab.adapters': 'IM Adapters',
|
||
'settings.adapters.description': 'Configure IM adapters to chat with Claude Code via Telegram, Feishu, WeChat, DingTalk, WhatsApp, WeCom, QQ, or Slack. For setup details, see',
|
||
'settings.adapters.configurationDocs': 'documentation link',
|
||
'settings.adapters.descriptionAfterDocs': '.',
|
||
'settings.adapters.imTabs': 'IM adapter',
|
||
'settings.adapters.telegram': 'Telegram',
|
||
'settings.adapters.feishu': 'Feishu',
|
||
'settings.adapters.wechat': 'WeChat',
|
||
'settings.adapters.dingtalk': 'DingTalk',
|
||
'settings.adapters.whatsapp': 'WhatsApp',
|
||
'settings.adapters.botToken': 'Bot Token',
|
||
'settings.adapters.botTokenPlaceholder': 'Paste token from @BotFather',
|
||
'settings.adapters.appId': 'App ID',
|
||
'settings.adapters.appIdPlaceholder': 'e.g. cli_xxx',
|
||
'settings.adapters.appSecret': 'App Secret',
|
||
'settings.adapters.appSecretPlaceholder': 'From Feishu Open Platform',
|
||
'settings.adapters.feishuCreateBotTitle': 'Need a Feishu bot?',
|
||
'settings.adapters.feishuCreateBotDesc': 'Use the documented OpenClaw template to create a Feishu bot with the required permissions already configured. Then paste the App ID and App Secret below.',
|
||
'settings.adapters.feishuCreateBotAction': 'Create Feishu bot',
|
||
'settings.adapters.feishuCreateBotStepCreate': 'Create the bot from the template.',
|
||
'settings.adapters.feishuCreateBotStepFill': 'Copy its App ID and App Secret, then fill them in here.',
|
||
'settings.adapters.encryptKey': 'Encrypt Key',
|
||
'settings.adapters.encryptKeyPlaceholder': 'Optional',
|
||
'settings.adapters.verificationToken': 'Verification Token',
|
||
'settings.adapters.verificationTokenPlaceholder': 'Optional',
|
||
'settings.adapters.allowedUsers': 'Allowed Users',
|
||
'settings.adapters.allowedUsersHint': 'Comma-separated. Leave empty to allow paired users only.',
|
||
'settings.adapters.tgAllowedUsersPlaceholder': 'e.g. 123456789, 987654321',
|
||
'settings.adapters.fsAllowedUsersPlaceholder': 'e.g. ou_xxx, ou_yyy',
|
||
'settings.adapters.wcAllowedUsersPlaceholder': 'e.g. wx_user_id_1, wx_user_id_2',
|
||
'settings.adapters.dtAllowedUsersPlaceholder': 'e.g. manager001, staff_yyy',
|
||
'settings.adapters.waAllowedUsersPlaceholder': 'e.g. 15551234567@s.whatsapp.net',
|
||
'settings.adapters.defaultProject': 'Default Project',
|
||
'settings.adapters.defaultProjectHint': 'Default working directory for new IM sessions. If empty, the bot uses the current user working directory.',
|
||
'settings.adapters.clearDefaultProject': 'Clear default project',
|
||
'settings.adapters.allowedRoots': 'Allowed project directories',
|
||
'settings.adapters.allowedRootsHint': 'The boundary for IM bots: they can only list, open and start sessions in projects inside these directories. Leave empty to use the default.',
|
||
'settings.adapters.allowedRootsOverridden': 'Overridden for {platforms} by a per-platform setting in adapters.json — changes here do not affect {platforms}.',
|
||
'settings.adapters.allowedRootsDefault': 'Default: your home directory (plus the default project, if it is outside home).',
|
||
'settings.adapters.removeAllowedRoot': 'Remove',
|
||
'settings.adapters.streamingCard': 'Streaming Card Mode',
|
||
'settings.adapters.streamingCardDesc': 'Real-time card updates for better experience',
|
||
'settings.adapters.serverUrl': 'Server URL',
|
||
'settings.adapters.serverUrlPlaceholder': 'ws://127.0.0.1:3456',
|
||
'settings.adapters.save': 'Save',
|
||
'settings.adapters.saved': 'Saved',
|
||
'settings.adapters.saving': 'Saving...',
|
||
'settings.adapters.startHint': 'After saving, run adapter: cd adapters && bun run {platform}',
|
||
'settings.adapters.pairing': 'Pairing',
|
||
'settings.adapters.pairingDesc': 'Generate a pairing code and send it to the Bot via IM private chat to bind your identity.',
|
||
'settings.adapters.generateCode': 'Generate Code',
|
||
'settings.adapters.regenerateCode': 'Regenerate',
|
||
'settings.adapters.codeExpired': 'Expired',
|
||
'settings.adapters.codeExpiresIn': 'Expires in',
|
||
'settings.adapters.minutes': 'min',
|
||
'settings.adapters.pairingCodeHint': 'Send this code to the bot in a private chat on any connected platform. Feishu, WeChat, DingTalk, WhatsApp, WeCom and QQ require QR binding first.',
|
||
'settings.adapters.pairedUsers': 'Paired Users',
|
||
'settings.adapters.noPairedUsers': 'No paired users yet',
|
||
'settings.adapters.unbind': 'Unbind',
|
||
'settings.adapters.unbindConfirm': 'Are you sure you want to unbind this user? They will need to re-pair to use the bot.',
|
||
'settings.adapters.platform.telegram': 'Telegram',
|
||
'settings.adapters.platform.feishu': 'Feishu',
|
||
'settings.adapters.platform.wechat': 'WeChat',
|
||
'settings.adapters.platform.dingtalk': 'DingTalk',
|
||
'settings.adapters.platform.whatsapp': 'WhatsApp',
|
||
'settings.adapters.dingtalkQrTitle': 'Bind DingTalk bot with QR',
|
||
'settings.adapters.dingtalkQrDesc': 'Scan with the DingTalk mobile app to create and authorize the bot. Client ID / Secret are saved automatically when it succeeds.',
|
||
'settings.adapters.dingtalkStartAuth': 'Scan to bind',
|
||
'settings.adapters.dingtalkUnbindBot': 'Unbind bot account',
|
||
'settings.adapters.dingtalkQrAlt': 'DingTalk authorization QR code',
|
||
'settings.adapters.dingtalkWaiting': 'Waiting for DingTalk scan confirmation...',
|
||
'settings.adapters.dingtalkBound': 'DingTalk bot is bound.',
|
||
'settings.adapters.dingtalkAuthFailed': 'DingTalk QR authorization failed.',
|
||
'settings.adapters.dingtalkAuthExpired': 'DingTalk QR authorization expired. Generate a new QR code.',
|
||
'settings.adapters.dingtalkUnbindFailed': 'Failed to unbind DingTalk.',
|
||
'settings.adapters.dingtalkUnbindBotConfirm': 'Unbind this DingTalk bot account? You will need to scan again before DingTalk can receive or send messages.',
|
||
'settings.adapters.dingtalkClientId': 'Client ID',
|
||
'settings.adapters.dingtalkClientIdPlaceholder': 'Filled by QR auth, or enter manually',
|
||
'settings.adapters.dingtalkClientSecret': 'Client Secret',
|
||
'settings.adapters.dingtalkClientSecretPlaceholder': 'Filled by QR auth, or enter manually',
|
||
'settings.adapters.dingtalkEndpoint': 'Stream Endpoint',
|
||
'settings.adapters.dingtalkEndpointPlaceholder': 'Default https://api.dingtalk.com',
|
||
'settings.adapters.dingtalkPermissionCardTemplateId': 'Permission Card Template ID',
|
||
'settings.adapters.dingtalkPermissionCardTemplateIdPlaceholder': 'Optional interactive card template ID',
|
||
'settings.adapters.dingtalkPermissionCardTemplateIdHint': 'When set, permission requests use a DingTalk interactive card first. Leave empty to use /allow, /always, /deny text approval.',
|
||
'settings.adapters.wechatBind': 'Scan to Bind',
|
||
'settings.adapters.wechatRebind': 'Rescan',
|
||
'settings.adapters.wechatConnected': 'WeChat is bound',
|
||
'settings.adapters.wechatNotConnected': 'WeChat is not bound',
|
||
'settings.adapters.wechatQrHint': 'Generate a QR code, scan it in WeChat, then confirm. The adapter restarts after binding.',
|
||
'settings.adapters.wechatQrAlt': 'WeChat binding QR code',
|
||
'settings.adapters.wechatWaiting': 'Waiting for WeChat confirmation...',
|
||
'settings.adapters.wechatBindSuccess': 'WeChat bound successfully.',
|
||
'settings.adapters.wechatUnbindAccount': 'Unbind WeChat account',
|
||
'settings.adapters.wechatUnbindAccountConfirm': 'Unbind this WeChat account? You will need to scan again before WeChat can receive or send messages.',
|
||
'settings.adapters.wechatUnbound': 'WeChat account unbound.',
|
||
'settings.adapters.wechatUnbindFailed': 'Failed to unbind WeChat.',
|
||
'settings.adapters.wechatAllowedUsersHint': 'QR binding enables the account only. Users still need to send a pairing code, or you can add allowed WeChat user IDs here.',
|
||
'settings.adapters.whatsappBind': 'Scan to Bind',
|
||
'settings.adapters.whatsappRebind': 'Rescan',
|
||
'settings.adapters.whatsappConnected': 'WhatsApp is bound',
|
||
'settings.adapters.whatsappNotConnected': 'WhatsApp is not bound',
|
||
'settings.adapters.whatsappQrHint': 'Generate a QR code, then scan it from WhatsApp > Linked devices. The adapter restarts after binding.',
|
||
'settings.adapters.whatsappQrAlt': 'WhatsApp binding QR code',
|
||
'settings.adapters.whatsappWaiting': 'Waiting for WhatsApp scan confirmation...',
|
||
'settings.adapters.whatsappBindSuccess': 'WhatsApp bound successfully.',
|
||
'settings.adapters.whatsappBindFailed': 'Failed to bind WhatsApp.',
|
||
'settings.adapters.whatsappUnbindAccount': 'Unbind WhatsApp account',
|
||
'settings.adapters.whatsappUnbindAccountConfirm': 'Unbind this WhatsApp account? You will need to scan again before WhatsApp can receive or send messages.',
|
||
'settings.adapters.whatsappUnbound': 'WhatsApp account unbound.',
|
||
'settings.adapters.whatsappUnbindFailed': 'Failed to unbind WhatsApp.',
|
||
'settings.adapters.whatsappAllowedUsersHint': 'QR binding links the WhatsApp Web account only. Users still need to send a pairing code, or you can add allowed WhatsApp JIDs here.',
|
||
|
||
// Settings > IM adapters — Feishu scan-to-create, WeCom, QQ, Slack
|
||
'settings.adapters.wecom': 'WeCom',
|
||
'settings.adapters.qq': 'QQ',
|
||
'settings.adapters.slack': 'Slack',
|
||
'settings.adapters.platform.wecom': 'WeCom',
|
||
'settings.adapters.platform.qq': 'QQ',
|
||
'settings.adapters.platform.slack': 'Slack',
|
||
'settings.adapters.feishuQrTitle': 'Create a Feishu bot by scanning',
|
||
'settings.adapters.feishuQrDesc': 'Scan with the Feishu mobile app. Confirming creates the bot and stores its App ID and App Secret here — no open platform setup by hand.',
|
||
'settings.adapters.feishuStartAuth': 'Scan to Create',
|
||
'settings.adapters.feishuRebind': 'Scan Again',
|
||
'settings.adapters.feishuUnbindApp': 'Unbind Feishu bot',
|
||
'settings.adapters.feishuUnbindAppConfirm': 'Unbind this Feishu bot? You will need to scan again or re-enter credentials before Feishu can send and receive messages.',
|
||
'settings.adapters.feishuQrAlt': 'Feishu authorization QR code',
|
||
'settings.adapters.feishuWaiting': 'Waiting for the Feishu scan...',
|
||
'settings.adapters.feishuBindSuccess': 'Feishu bot created and bound.',
|
||
'settings.adapters.feishuAuthFailed': 'Feishu QR authorization failed.',
|
||
'settings.adapters.feishuUnbound': 'Feishu binding removed.',
|
||
'settings.adapters.feishuUnbindFailed': 'Failed to unbind Feishu.',
|
||
'settings.adapters.wecomQrTitle': 'Create a WeCom bot by scanning',
|
||
'settings.adapters.wecomQrDesc': 'Scan with Enterprise WeChat to create an AI bot. The Bot ID and Secret are saved automatically and the adapter restarts.',
|
||
'settings.adapters.wecomBind': 'Scan to Bind',
|
||
'settings.adapters.wecomRebind': 'Scan Again',
|
||
'settings.adapters.wecomUnbindBot': 'Unbind bot account',
|
||
'settings.adapters.wecomUnbindBotConfirm': 'Unbind this WeCom bot? You will need to scan again before WeCom can send and receive messages.',
|
||
'settings.adapters.wecomQrAlt': 'WeCom authorization QR code',
|
||
'settings.adapters.wecomWaiting': 'Waiting for the WeCom scan...',
|
||
'settings.adapters.wecomBindSuccess': 'WeCom bot bound.',
|
||
'settings.adapters.wecomBindFailed': 'WeCom binding failed.',
|
||
'settings.adapters.wecomUnbound': 'WeCom binding removed.',
|
||
'settings.adapters.wecomUnbindFailed': 'Failed to unbind WeCom.',
|
||
'settings.adapters.wecomAllowedUsersPlaceholder': 'e.g. zhangsan, lisi',
|
||
'settings.adapters.wecomAllowedUsersHint': 'WeCom userids, comma separated. Leave empty to allow paired users only.',
|
||
'settings.adapters.qqQrTitle': 'Create a QQ bot by scanning',
|
||
'settings.adapters.qqQrDesc': 'Scan with the QQ mobile app. The AppID and AppSecret are saved automatically and the adapter restarts.',
|
||
'settings.adapters.qqBind': 'Scan to Bind',
|
||
'settings.adapters.qqRebind': 'Scan Again',
|
||
'settings.adapters.qqUnbindBot': 'Unbind bot account',
|
||
'settings.adapters.qqUnbindBotConfirm': 'Unbind this QQ bot? You will need to scan again before QQ can send and receive messages.',
|
||
'settings.adapters.qqQrAlt': 'QQ authorization QR code',
|
||
'settings.adapters.qqWaiting': 'Waiting for the QQ scan...',
|
||
'settings.adapters.qqBindSuccess': 'QQ bot bound.',
|
||
'settings.adapters.qqBindFailed': 'QQ binding failed.',
|
||
'settings.adapters.qqUnbound': 'QQ binding removed.',
|
||
'settings.adapters.qqUnbindFailed': 'Failed to unbind QQ.',
|
||
'settings.adapters.qqAllowedUsersPlaceholder': 'e.g. A1B2C3D4E5F6',
|
||
'settings.adapters.qqAllowedUsersHint': 'QQ user openids, comma separated. Leave empty to allow paired users only.',
|
||
'settings.adapters.slackCreateAppTitle': 'Create a Slack app',
|
||
'settings.adapters.slackCreateAppDesc': 'Slack has no scan flow, so it uses an app manifest instead: the button below opens the create page with the scopes and Socket Mode already filled in.',
|
||
'settings.adapters.slackCreateAppAction': 'Create app from manifest',
|
||
'settings.adapters.slackStepCreate': 'Open the create page, review the manifest and create the app.',
|
||
'settings.adapters.slackStepInstall': 'Install the app into your workspace and copy the Bot Token (starts with xoxb-).',
|
||
'settings.adapters.slackStepTokens': 'Under Basic Information generate an App-Level Token (starts with xapp-, scope connections:write) and paste both below.',
|
||
'settings.adapters.slackManifestToggle': 'Show the app manifest JSON',
|
||
'settings.adapters.slackManifestFailed': 'Could not load the Slack app manifest.',
|
||
'settings.adapters.slackBotToken': 'Bot Token',
|
||
'settings.adapters.slackBotTokenPlaceholder': 'starts with xoxb-',
|
||
'settings.adapters.slackAppToken': 'App-Level Token',
|
||
'settings.adapters.slackAppTokenPlaceholder': 'starts with xapp-, needs connections:write',
|
||
'settings.adapters.slackAllowedUsersPlaceholder': 'e.g. U01ABCDEF, U02GHIJKL',
|
||
'settings.adapters.slackUnbindApp': 'Unbind Slack app',
|
||
'settings.adapters.slackUnbound': 'Slack binding removed.',
|
||
'settings.adapters.slackUnbindFailed': 'Failed to unbind Slack.',
|
||
'settings.adapters.slackUnbindAppConfirm': 'Unbind this Slack app? You will need to re-enter the tokens before Slack can send and receive messages.',
|
||
|
||
// Settings > MCP
|
||
'settings.mcp.title': 'MCP servers',
|
||
'settings.mcp.description': 'Connect external tools and data sources for Claude Code. Local, project, and user scopes follow the same behavior as the CLI.',
|
||
'settings.mcp.addServer': 'Add server',
|
||
'settings.mcp.openServer': 'Open {name}',
|
||
'settings.mcp.empty': 'No MCP servers configured yet',
|
||
'settings.mcp.emptyHint': 'Add a custom stdio, HTTP, or SSE MCP server to start extending tool access.',
|
||
'settings.mcp.stats.total': 'Total servers',
|
||
'settings.mcp.stats.connected': 'Connection checks for current project',
|
||
'settings.mcp.stats.attention': 'Need attention',
|
||
'settings.mcp.status.configured': 'Configured',
|
||
'settings.mcp.status.configuredElsewhere': 'Not loaded in the current chat. Open a chat in this project to use it.',
|
||
'settings.mcp.scope.project': 'Project',
|
||
'settings.mcp.scope.local': 'Local',
|
||
'settings.mcp.scope.user': 'User',
|
||
'settings.mcp.scope.plugin': 'Plugin',
|
||
'settings.mcp.scopeDesc.local': 'Private to you for one project. Stored in your user config, scoped by the selected project.',
|
||
'settings.mcp.scopeDesc.project': 'Shared with the team through the selected project’s `.mcp.json`.',
|
||
'settings.mcp.scopeDesc.user': 'Available in all projects for your user account.',
|
||
'settings.mcp.scope.dynamic': 'Built-in',
|
||
'settings.mcp.scope.enterprise': 'Enterprise',
|
||
'settings.mcp.scope.claudeai': 'Claude.ai',
|
||
'settings.mcp.scope.managed': 'Managed',
|
||
'settings.mcp.transport.http': 'Streamable HTTP',
|
||
'settings.mcp.globalOnlyHint': 'Choose Local for one project, Project for `.mcp.json`, or User for all projects.',
|
||
'settings.mcp.currentProjectHint': 'Selected project: {path}',
|
||
'settings.mcp.form.back': 'Back to servers',
|
||
'settings.mcp.form.createTitle': 'Connect to a custom MCP',
|
||
'settings.mcp.form.createHint': 'Set up a custom MCP server with the fields supported by Claude Code today.',
|
||
'settings.mcp.form.editTitle': 'Configure {name} MCP',
|
||
'settings.mcp.form.editHint': 'Review connection details, save changes, or reconnect this server from the desktop app.',
|
||
'settings.mcp.form.transportLocked': 'If you would like to switch MCP server type, uninstall first.',
|
||
'settings.mcp.form.uninstall': 'Uninstall',
|
||
'settings.mcp.form.reconnect': 'Reconnect',
|
||
'settings.mcp.form.save': 'Save',
|
||
'settings.mcp.form.name': 'Name',
|
||
'settings.mcp.form.namePlaceholder': 'MCP server name',
|
||
'settings.mcp.form.scope': 'Config scope',
|
||
'settings.mcp.form.transport': 'Transport',
|
||
'settings.mcp.form.status': 'Status',
|
||
'settings.mcp.form.location': 'Config location',
|
||
'settings.mcp.form.rawConfig': 'Raw config',
|
||
'settings.mcp.form.command': 'Command to launch',
|
||
'settings.mcp.form.commandPlaceholder': 'npx',
|
||
'settings.mcp.form.commandHostHint': 'STDIO MCP commands run on the host machine. Install runtimes like Node.js, Python, Bun, or uv yourself and make sure the command is available in PATH.',
|
||
'settings.mcp.form.arguments': 'Arguments',
|
||
'settings.mcp.form.argumentPlaceholder': 'chrome-devtools-mcp@latest',
|
||
'settings.mcp.form.addArgument': 'Add argument',
|
||
'settings.mcp.form.environmentVariables': 'Environment variables',
|
||
'settings.mcp.form.addEnv': 'Add environment variable',
|
||
'settings.mcp.form.keyPlaceholder': 'Key',
|
||
'settings.mcp.form.valuePlaceholder': 'Value',
|
||
'settings.mcp.form.url': 'URL',
|
||
'settings.mcp.form.sseUrl': 'SSE URL',
|
||
'settings.mcp.form.urlPlaceholder': 'https://mcp.example.com/mcp',
|
||
'settings.mcp.form.headers': 'Headers',
|
||
'settings.mcp.form.addHeader': 'Add header',
|
||
'settings.mcp.form.oauthClientId': 'OAuth client ID',
|
||
'settings.mcp.form.oauthClientIdPlaceholder': 'Optional client ID',
|
||
'settings.mcp.form.oauthCallbackPort': 'OAuth callback port',
|
||
'settings.mcp.form.oauthCallbackPortPlaceholder': 'Optional fixed callback port',
|
||
'settings.mcp.form.headersHelper': 'Headers helper script',
|
||
'settings.mcp.form.headersHelperPlaceholder': 'Optional helper command path',
|
||
'settings.mcp.form.deleteTitle': 'Delete MCP server',
|
||
'settings.mcp.form.cancel': 'Cancel',
|
||
'settings.mcp.form.confirmDelete': 'Delete',
|
||
'settings.mcp.form.deleteConfirm': 'Delete MCP server "{name}"? This cannot be undone.',
|
||
'settings.mcp.form.deleteConfirmBody': 'Delete MCP server "{name}"? This action cannot be undone.',
|
||
'settings.mcp.targetProject.title': 'Target project',
|
||
'settings.mcp.targetProject.selected': 'Currently viewing local and shared MCP servers for: {path}',
|
||
'settings.mcp.targetProject.empty': 'Choose a project to inspect project-private or project-shared MCP servers.',
|
||
'settings.mcp.targetProject.emptyWithCurrent': 'Choose a target project. The current active session is: {path}',
|
||
'settings.mcp.targetProject.localSelected': 'This server will be private to you inside: {path}',
|
||
'settings.mcp.targetProject.localEmpty': 'Choose the project that should receive this private MCP server.',
|
||
'settings.mcp.targetProject.projectSelected': 'This server will be shared through: {path}/.mcp.json',
|
||
'settings.mcp.targetProject.projectEmpty': 'Choose the project whose `.mcp.json` should receive this shared MCP server.',
|
||
'settings.mcp.targetProject.globalTitle': 'Global install target',
|
||
'settings.mcp.targetProject.globalHint': 'User scope does not need a target project. It is stored in your global Claude config and is available everywhere.',
|
||
'settings.mcp.toast.created': 'Created MCP server "{name}"',
|
||
'settings.mcp.toast.saved': 'Saved MCP server "{name}"',
|
||
'settings.mcp.toast.deleted': 'Deleted MCP server "{name}"',
|
||
'settings.mcp.toast.enabled': 'Enabled MCP server "{name}"',
|
||
'settings.mcp.toast.disabled': 'Disabled MCP server "{name}"',
|
||
'settings.mcp.toast.reconnected': 'Reconnected MCP server "{name}"',
|
||
'settings.mcp.toast.saveFailed': 'Failed to save MCP server',
|
||
'settings.mcp.toast.deleteFailed': 'Failed to delete MCP server',
|
||
'settings.mcp.toast.toggleFailed': 'Failed to update MCP server state',
|
||
'settings.mcp.toast.reconnectFailed': 'Failed to reconnect MCP server',
|
||
'settings.mcp.toast.syncFailed': 'Chat synchronization failed: {error}',
|
||
'settings.mcp.toast.syncNotRunning': 'The current chat is not running; the setting will apply when it starts.',
|
||
'settings.mcp.toast.syncDifferentProject': 'The current chat uses a different project; its tools were not updated.',
|
||
'settings.mcp.toast.syncNoSession': 'No chat was selected; settings were saved.',
|
||
'settings.mcp.toast.syncUnconfirmed': 'The current chat update was not confirmed.',
|
||
|
||
// Settings > Agents
|
||
'settings.tab.agents': 'Agents',
|
||
'settings.agents.title': 'Installed Agents',
|
||
'settings.agents.loadError': 'Failed to load agents',
|
||
'settings.agents.description': 'Browse agents available to Claude across built-in, project, and user sources. Use /agents in TUI to inspect active sources and overrides.',
|
||
'settings.agents.browserTitle': 'Browse installed agents',
|
||
'settings.agents.browserEyebrow': 'Agent Browser',
|
||
'settings.agents.entryEyebrow': 'Agent Profile',
|
||
'settings.agents.empty': 'No agents available yet.',
|
||
'settings.agents.emptyHint': 'Add agent definitions in your Claude settings or project to see them here.',
|
||
'settings.agents.refreshWarning': 'The change was saved, but the latest agent configuration could not be fully applied.',
|
||
'settings.agents.model': 'Model',
|
||
'settings.agents.tools': 'Tools',
|
||
'settings.agents.systemPrompt': 'System Prompt',
|
||
'settings.agents.noDescription': 'No description',
|
||
'settings.agents.noSystemPrompt': 'No system prompt defined.',
|
||
'settings.agents.backToList': 'Back to list',
|
||
'settings.agents.agentCount': '{count} agents',
|
||
'settings.agents.summary.totalAgents': 'Total agents',
|
||
'settings.agents.summary.activeAgents': 'Active agents',
|
||
'settings.agents.summary.sources': 'Sources',
|
||
'settings.agents.summary.source': 'Source',
|
||
'settings.agents.summary.model': 'Model',
|
||
'settings.agents.summary.tools': 'Tools',
|
||
'settings.agents.summary.status': 'Status',
|
||
'settings.agents.groupHint': '{count} agents available from {source}',
|
||
'settings.agents.status.active': 'Active',
|
||
'settings.agents.status.available': 'Available',
|
||
'settings.agents.overriddenBy': 'Overridden by {source}',
|
||
'settings.agents.overriddenByShort': 'shadowed by {source}',
|
||
'settings.agents.toolCount': '{count} tools',
|
||
'settings.agents.noTools': 'No tool restriction',
|
||
'settings.agents.disabledTools': 'No tools allowed',
|
||
'settings.agents.promptHint': 'Read the current system prompt and compare how this agent is scoped.',
|
||
'settings.agents.source.userSettings': 'User',
|
||
'settings.agents.source.projectSettings': 'Project',
|
||
'settings.agents.source.localSettings': 'Local',
|
||
'settings.agents.source.policySettings': 'Managed',
|
||
'settings.agents.source.plugin': 'Plugin',
|
||
'settings.agents.source.flagSettings': 'CLI arg',
|
||
'settings.agents.source.built-in': 'Built-in',
|
||
'settings.agents.create': 'Create Agent',
|
||
'settings.agents.createTitle': 'Create Agent',
|
||
'settings.agents.edit': 'Edit',
|
||
'settings.agents.editTitle': 'Edit Agent',
|
||
'settings.agents.delete': 'Delete',
|
||
'settings.agents.readOnly': 'Read only',
|
||
'settings.agents.deleteTitle': 'Delete Agent',
|
||
'settings.agents.deleteBody': 'Delete agent "{name}"? This cannot be undone.',
|
||
'settings.agents.deleteTarget': 'File: {target}',
|
||
'settings.agents.deleteConfirm': 'Delete Agent',
|
||
'settings.agents.deleteError': 'Failed to delete agent',
|
||
'settings.agents.detail.configuredModel': 'Configured model',
|
||
'settings.agents.detail.configuredEffort': 'Configured effort',
|
||
'settings.agents.detail.effortHint': 'Runtime may lower or omit this value when the selected model does not support it.',
|
||
'settings.agents.detail.inherit': 'Inherit',
|
||
'settings.agents.form.scope': 'Scope',
|
||
'settings.agents.form.scopeUser': 'User',
|
||
'settings.agents.form.scopeProject': 'Project',
|
||
'settings.agents.form.projectUnavailable': 'Open a project session to create a project-scoped agent.',
|
||
'settings.agents.form.projectTarget': 'Target project: {path}',
|
||
'settings.agents.form.name': 'Name',
|
||
'settings.agents.form.namePlaceholder': 'code-reviewer',
|
||
'settings.agents.form.nameError': 'Use 1–64 lowercase letters, numbers, hyphens, or underscores; start and end with a letter or number.',
|
||
'settings.agents.form.description': 'Description',
|
||
'settings.agents.form.descriptionPlaceholder': 'Explain when the main agent should delegate to this agent.',
|
||
'settings.agents.form.descriptionRequired': 'Enter a description.',
|
||
'settings.agents.form.systemPrompt': 'System prompt',
|
||
'settings.agents.form.systemPromptPlaceholder': 'Define this agent\'s role, boundaries, and expected output.',
|
||
'settings.agents.form.systemPromptRequired': 'Enter a system prompt.',
|
||
'settings.agents.form.model': 'Model',
|
||
'settings.agents.form.modelDefaultDescription': 'Use the default shipped with this Claude Code build.',
|
||
'settings.agents.form.modelInheritDescription': 'Use the same model as the main conversation.',
|
||
'settings.agents.form.modelAliasDescription': 'CLI model alias mapped through the current provider.',
|
||
'settings.agents.form.modelUnavailableDescription': 'Saved model ID; it is not listed by the current provider.',
|
||
'settings.agents.form.modelProviderHint': 'Agent configuration stores a model ID, not a provider. It runs through the session\'s current provider.',
|
||
'settings.agents.form.effort': 'Reasoning effort',
|
||
'settings.agents.form.inherit': 'Inherit from parent',
|
||
'settings.agents.form.tools': 'Tools',
|
||
'settings.agents.form.toolsInherit': 'All tools',
|
||
'settings.agents.form.toolsNone': 'No tools',
|
||
'settings.agents.form.toolsCustom': 'Custom list',
|
||
'settings.agents.form.toolsCustomLabel': 'Other tool names or permission patterns',
|
||
'settings.agents.form.toolsPlaceholder': 'mcp__docs__search, Bash(git:*)',
|
||
'settings.agents.form.toolsHint': 'Select the built-in tools this agent needs. Add custom or MCP tools below.',
|
||
'settings.agents.form.builtInTools': 'Built-in tools',
|
||
'settings.agents.form.builtInToolsHint': 'Available in the current runtime. Grant only what this Agent needs.',
|
||
'settings.agents.form.toolsSelectedCount': '{count} selected',
|
||
'settings.agents.form.toolsSearch': 'Search tools',
|
||
'settings.agents.form.toolsSearchPlaceholder': 'Search by name or purpose',
|
||
'settings.agents.form.toolsNoResults': 'No matching tools',
|
||
'settings.agents.form.toolsUnavailable': 'The built-in tool list is unavailable. You can still enter exact tool names below.',
|
||
'settings.agents.form.toolsCustomHint': 'Optional. Use this for MCP tools, custom tools, or permission patterns such as Bash(git:*).',
|
||
'settings.agents.form.toolCategory.readSearch': 'Read and search',
|
||
'settings.agents.form.toolCategory.modify': 'Modify files',
|
||
'settings.agents.form.toolCategory.execute': 'Run commands',
|
||
'settings.agents.form.toolCategory.workflow': 'Workflow',
|
||
'settings.agents.form.toolCategory.other': 'Other',
|
||
'settings.agents.form.toolDescription.Read': 'Read files and directories',
|
||
'settings.agents.form.toolDescription.Glob': 'Find files by name or path pattern',
|
||
'settings.agents.form.toolDescription.Grep': 'Search files by text or pattern',
|
||
'settings.agents.form.toolDescription.WebFetch': 'Read content from a web page',
|
||
'settings.agents.form.toolDescription.WebSearch': 'Search the web',
|
||
'settings.agents.form.toolDescription.Edit': 'Apply targeted edits to existing files',
|
||
'settings.agents.form.toolDescription.Write': 'Create or replace files',
|
||
'settings.agents.form.toolDescription.NotebookEdit': 'Edit Jupyter notebook cells',
|
||
'settings.agents.form.toolDescription.Bash': 'Run terminal commands in a Unix shell',
|
||
'settings.agents.form.toolDescription.PowerShell': 'Run Windows PowerShell commands',
|
||
'settings.agents.form.toolDescription.TodoWrite': 'Maintain a task checklist',
|
||
'settings.agents.form.toolDescription.Skill': 'Load an installed skill workflow',
|
||
'settings.agents.form.toolDescription.ToolSearch': 'Discover deferred tools by capability',
|
||
'settings.agents.form.toolDescription.EnterWorktree': 'Create and enter an isolated Git worktree',
|
||
'settings.agents.form.toolDescription.ExitWorktree': 'Leave and clean up an Agent worktree',
|
||
'settings.agents.form.toolDescription.StructuredOutput': 'Return schema-validated structured data',
|
||
'settings.agents.form.toolDescription.generic': 'Use this built-in runtime capability',
|
||
'settings.agents.form.toolsInheritHint': 'The tools field is omitted, which gives this agent access to all tools.',
|
||
'settings.agents.form.toolsNoneHint': 'An empty tools list is saved, so this agent cannot use tools.',
|
||
'settings.agents.form.toolsCustomRequired': 'Select or enter at least one allowed tool.',
|
||
'settings.agents.form.color': 'Color',
|
||
'settings.agents.form.noColor': 'Default',
|
||
'settings.agents.form.saveError': 'Failed to save agent',
|
||
'settings.agents.rowEdit': 'Edit {name}',
|
||
'settings.agents.rowDelete': 'Delete {name}',
|
||
'settings.agents.rowOverride': 'Adjust the model and effort for {name}',
|
||
'settings.agents.override': 'Adjust model',
|
||
'settings.agents.overrideTitle': 'Adjust built-in agent',
|
||
'settings.agents.overrideHint': 'Only the model and effort can be changed. The system prompt, tools and color are fixed by Claude Code.',
|
||
'settings.agents.overrideScopeHint': 'Saved to your user settings (~/.claude/settings.json) and applied to every project.',
|
||
'settings.agents.overrideDefault': 'Built-in default ({value})',
|
||
'settings.agents.overrideDefaultNone': 'Built-in default',
|
||
'settings.agents.overrideReset': 'Reset to built-in default',
|
||
'settings.agents.overrideBadge': 'Overridden',
|
||
'settings.agents.overrideManaged': 'Set by {source} settings and not editable here.',
|
||
'settings.agents.overrideShadowed': 'An agent of the same name from {source} is active, so changes here will not take effect yet.',
|
||
'settings.agents.overrideSaveError': 'Failed to save the override',
|
||
'settings.agents.overrideResetError': 'Failed to reset to the built-in default',
|
||
|
||
// Settings > Skills
|
||
'settings.skills.title': 'Installed Skills',
|
||
'settings.skills.description': 'Skills extend Claude with specialized capabilities. Manage skills in ~/.claude/skills/ or ~/.agents/skills/',
|
||
'settings.skills.redirectDescription': 'Skills now live in the unified Skill Center, where marketplace and installed skills are managed together.',
|
||
'settings.skills.browserTitle': 'Browse installed skills',
|
||
'settings.skills.browserEyebrow': 'Skill Browser',
|
||
'settings.skills.browserDescription': 'Inspect bundled, project, and user skills, compare their scope, and open each skill folder to read its docs and source files.',
|
||
'settings.skills.searchLabel': 'Search skills',
|
||
'settings.skills.searchPlaceholder': 'Search skills by name, description, or source...',
|
||
'settings.skills.searchResultCount': '{count} of {total} skills match',
|
||
'settings.skills.clearSearch': 'Clear skill search',
|
||
'settings.skills.noSearchResults': 'No matching skills',
|
||
'settings.skills.noSearchResultsHint': 'Try another keyword or clear search to show every skill.',
|
||
'settings.skills.entryEyebrow': 'Skill Entry',
|
||
'settings.skills.slashCommand': '/slash',
|
||
'settings.skills.agentsDirBadge': '.agents',
|
||
'settings.skills.agentsDirHint':
|
||
'From the ~/.agents/skills/ open standard directory, shared with Codex, Cursor, and Gemini CLI',
|
||
'settings.skills.agentsDirProjectHint':
|
||
"From this project's .agents/skills/ directory — it ships with the repository, not with your own setup",
|
||
'settings.skills.tokenEstimate': '~{count} tokens',
|
||
'settings.skills.tokenEstimateShort': '~{count}',
|
||
'settings.skills.summary.totalSkills': 'Total skills',
|
||
'settings.skills.summary.totalFiles': 'Files',
|
||
'settings.skills.summary.sources': 'Sources',
|
||
'settings.skills.summary.tokens': 'Estimated tokens',
|
||
'settings.skills.summary.source': 'Source',
|
||
'settings.skills.summary.entry': 'Entry',
|
||
'settings.skills.groupHint': '{count} skills available from {source}',
|
||
'settings.skills.ready': 'Ready',
|
||
'settings.skills.unavailable': 'Unavailable',
|
||
'settings.skills.empty': 'No skills installed',
|
||
'settings.skills.emptyHint': 'Add skills to ~/.claude/skills/ or ~/.agents/skills/ to get started',
|
||
'settings.skills.back': 'Back to list',
|
||
'settings.skills.files': 'files',
|
||
'settings.skills.entryFile': 'entry file',
|
||
'settings.skills.metaTitle': 'Skill metadata',
|
||
'settings.skills.filesPanel': 'Files',
|
||
'settings.skills.filesPanelHint': 'Browse the entry file and supporting implementation files.',
|
||
'settings.skills.readingMode': 'Viewing in {mode}',
|
||
'settings.skills.docMode': 'document mode',
|
||
'settings.skills.codeMode': 'code mode',
|
||
'settings.skills.source.user': 'User',
|
||
'settings.skills.source.project': 'Project',
|
||
'settings.skills.source.plugin': 'Plugin',
|
||
'settings.skills.source.mcp': 'MCP',
|
||
'settings.skills.source.bundled': 'Built-in',
|
||
|
||
// Settings > Memory
|
||
'settings.tab.memory': 'Memory',
|
||
'settings.memory.title': 'Project Memory',
|
||
'settings.memory.description': 'Inspect and edit the Markdown memory files Claude writes for each project. These files are stored under ~/.claude/projects/<project>/memory/ and are loaded by the CLI runtime.',
|
||
'settings.memory.refresh': 'Refresh',
|
||
'settings.memory.projects': 'Projects',
|
||
'settings.memory.files': 'Memory files',
|
||
'settings.memory.filePath': 'Memory file path',
|
||
'settings.memory.resourceManager': 'Resource manager',
|
||
'settings.memory.editor': 'Editor',
|
||
'settings.memory.edit': 'Edit',
|
||
'settings.memory.preview': 'Preview',
|
||
'settings.memory.rendered': 'Rendered',
|
||
'settings.memory.emptyProjects': 'No memory projects found.',
|
||
'settings.memory.emptyFiles': 'No memory files found yet.',
|
||
'settings.memory.selectFile': 'Select a memory file.',
|
||
'settings.memory.selectProject': 'Select a project.',
|
||
'settings.memory.noFileSelected': 'No file selected',
|
||
'settings.memory.current': 'Current',
|
||
'settings.memory.indexFile': 'Index',
|
||
'settings.memory.missing': 'Missing',
|
||
'settings.memory.fileCount': '{count} files',
|
||
'settings.memory.unsaved': 'Unsaved',
|
||
'settings.memory.saved': 'Saved',
|
||
'settings.memory.revert': 'Revert',
|
||
'settings.memory.discardUnsavedConfirm': 'Discard unsaved memory changes?',
|
||
'settings.memory.projectSearchPlaceholder': 'Search projects by path...',
|
||
'settings.memory.fileSearchPlaceholder': 'Search memory files...',
|
||
'settings.memory.resourceSearchPlaceholder': 'Search projects or memory files...',
|
||
'settings.memory.noProjectMatches': 'No projects match this search.',
|
||
'settings.memory.noFileMatches': 'No memory files match this search.',
|
||
'settings.memory.clearSearch': 'Clear search',
|
||
'settings.memory.toggleFolder': 'Toggle {name}',
|
||
|
||
// Settings > Plugins
|
||
'settings.plugins.title': 'Installed Plugins',
|
||
'settings.plugins.description': 'Inspect installed plugins, see their health, and apply changes to the desktop runtime.',
|
||
'settings.plugins.browserTitle': 'Browse installed plugins',
|
||
'settings.plugins.browserEyebrow': 'Plugin Manager',
|
||
'settings.plugins.browserDescription': 'Plugins bundle skills, agents, hooks, MCP servers, and language tooling. This view keeps the desktop surface focused on installed plugins, health, and apply-to-runtime feedback.',
|
||
'settings.plugins.entryEyebrow': 'Plugin Detail',
|
||
'settings.plugins.summary.total': 'Total plugins',
|
||
'settings.plugins.summary.enabled': 'Enabled',
|
||
'settings.plugins.summary.attention': 'Needs attention',
|
||
'settings.plugins.summary.marketplaces': 'Marketplaces',
|
||
'settings.plugins.summary.skills': 'Skills',
|
||
'settings.plugins.summary.agents': 'Agents',
|
||
'settings.plugins.summary.mcp': 'MCP',
|
||
'settings.plugins.summary.hooks': 'Hooks',
|
||
'settings.plugins.group.attention': 'Needs attention',
|
||
'settings.plugins.group.enabled': 'Enabled',
|
||
'settings.plugins.group.disabled': 'Disabled',
|
||
'settings.plugins.groupHint': '{count} plugins in this section',
|
||
'settings.plugins.refresh': 'Refresh',
|
||
'settings.plugins.apply': 'Apply changes',
|
||
'settings.plugins.applyHint': 'Enable, disable, and update changes become active after applying them to the current desktop runtime.',
|
||
'settings.plugins.lastReload': 'Last apply: {enabled} active plugins, {skills} plugin skills, {errors} errors.',
|
||
'settings.plugins.reloadToast': 'Applied plugin changes: {enabled} active plugins, {skills} skills, {errors} errors.',
|
||
'settings.plugins.reloadWarning': 'Plugin change applied, but reloading the runtime failed: {message}',
|
||
'settings.plugins.marketplacesTitle': 'Known marketplaces',
|
||
'settings.plugins.marketplacesHint': 'Read-only summary of marketplace sources already configured for this machine.',
|
||
'settings.plugins.marketplaceAutoUpdateOn': 'Auto-update on',
|
||
'settings.plugins.marketplaceAutoUpdateOff': 'Auto-update off',
|
||
'settings.plugins.marketplaceInstalledCount': '{count} installed',
|
||
'settings.plugins.marketplaceUpdatedAt': 'Updated {value}',
|
||
'settings.plugins.status.enabled': 'Enabled',
|
||
'settings.plugins.status.disabled': 'Disabled',
|
||
'settings.plugins.status.attention': 'Attention',
|
||
'settings.plugins.scope.user': 'User',
|
||
'settings.plugins.scope.project': 'Project',
|
||
'settings.plugins.scope.local': 'Local',
|
||
'settings.plugins.scope.managed': 'Managed',
|
||
'settings.plugins.scope.builtin': 'Built-in',
|
||
'settings.plugins.empty': 'No plugins installed',
|
||
'settings.plugins.emptyHint': 'Install plugins from Claude Code to manage them here.',
|
||
'settings.plugins.back': 'Back to list',
|
||
'settings.plugins.noDescription': 'No description available for this plugin.',
|
||
'settings.plugins.errorCount': '{count} errors',
|
||
'settings.plugins.enable': 'Enable',
|
||
'settings.plugins.disable': 'Disable',
|
||
'settings.plugins.update': 'Update',
|
||
'settings.plugins.uninstall': 'Uninstall',
|
||
'settings.plugins.confirmUninstall': 'Uninstall plugin "{name}"? This removes the installed copy for the selected scope.',
|
||
'settings.plugins.selectionCount': '{count} selected',
|
||
'settings.plugins.clearSelection': 'Clear',
|
||
'settings.plugins.enableSelected': 'Enable selected',
|
||
'settings.plugins.disableSelected': 'Disable selected',
|
||
'settings.plugins.selectPlugin': 'Select {name}',
|
||
'settings.plugins.bulkEnableTitle': 'Enable {count} selected plugins?',
|
||
'settings.plugins.bulkDisableTitle': 'Disable {count} selected plugins?',
|
||
'settings.plugins.bulkEnableBody': 'This will enable {names} and apply plugin changes to the current desktop runtime.',
|
||
'settings.plugins.bulkDisableBody': 'This will disable {names} and apply plugin changes to the current desktop runtime.',
|
||
'settings.plugins.bulkEnableToast': 'Enabled {count} plugins and applied plugin changes.',
|
||
'settings.plugins.bulkDisableToast': 'Disabled {count} plugins and applied plugin changes.',
|
||
'settings.plugins.author': 'Author: {value}',
|
||
'settings.plugins.projectPath': 'Project: {value}',
|
||
'settings.plugins.installPath': 'Installed at: {value}',
|
||
'settings.plugins.managedHint': 'This plugin is managed by policy and cannot be changed from the desktop app.',
|
||
'settings.plugins.builtinHint': 'Built-in plugins can be reloaded here, but install and uninstall actions are not exposed.',
|
||
'settings.plugins.errorsTitle': 'Plugin errors',
|
||
'settings.plugins.capabilitiesTitle': 'Bundled capabilities',
|
||
'settings.plugins.capabilitiesHint': 'Capabilities exposed by this plugin after loading its manifest and runtime integrations.',
|
||
'settings.plugins.sharedNavigationDisabled': 'Enable this plugin and apply changes before opening its skills, agents, or MCP entries in the shared management pages.',
|
||
'settings.plugins.capabilityEmpty': 'None exposed',
|
||
'settings.plugins.capability.skills': '{count} skills',
|
||
'settings.plugins.capability.agents': '{count} agents',
|
||
'settings.plugins.capability.mcpServers': '{count} MCP servers',
|
||
'settings.plugins.capabilityLabel.skills': 'Skills',
|
||
'settings.plugins.capabilityLabel.commands': 'Commands',
|
||
'settings.plugins.capabilityLabel.agents': 'Agents',
|
||
'settings.plugins.capabilityLabel.hooks': 'Hooks',
|
||
'settings.plugins.capabilityLabel.mcpServers': 'MCP servers',
|
||
'settings.plugins.capabilityLabel.lspServers': 'LSP servers',
|
||
|
||
// Settings > About
|
||
'settings.tab.about': 'About',
|
||
'settings.about.version': 'Version',
|
||
'settings.about.changelog': 'Release Notes',
|
||
'settings.about.repo': 'GitHub Repository',
|
||
'settings.about.starHint': 'If this project helps you, consider giving it a Star',
|
||
'settings.about.feedback': 'Report an Issue',
|
||
'settings.about.feedbackDesc': 'Open a GitHub Issue for bugs or usage questions',
|
||
'settings.about.community': 'Join the cc-haha group',
|
||
'settings.about.communityDesc': 'A WeCom group. Scan the code to join; conversation there is mostly in Chinese',
|
||
'settings.about.communityHint': 'Scan with WeChat or WeCom to join',
|
||
'settings.about.communityQrAlt': 'cc-haha WeCom user group QR code',
|
||
'settings.about.author': 'Author',
|
||
'settings.about.socialMedia': 'Social Media',
|
||
'settings.about.updates': 'App Updates',
|
||
'settings.about.updatesDesc': 'Check GitHub Releases, download the installer, and relaunch after install.',
|
||
|
||
// Settings > Computer Use
|
||
'settings.tab.computerUse': 'Computer Use',
|
||
'settings.computerUse.title': 'Computer Use',
|
||
'settings.computerUse.description': 'Allow Claude to take screenshots, click, type, and control your computer. Requires Python 3. On macOS, accessibility permissions are also needed.',
|
||
'settings.computerUse.enabledToggle': 'Enabled',
|
||
'settings.computerUse.enableRiskTitle': 'Enable Computer Use?',
|
||
'settings.computerUse.enableRiskSummary': 'Computer Use gives Claude broad control of this computer. Only enable it when you understand and accept these risks.',
|
||
'settings.computerUse.enableRiskScreen': 'Claude can take screenshots and may see sensitive or private information on screen.',
|
||
'settings.computerUse.enableRiskActions': 'Claude can click, type, use the clipboard and system shortcuts, and may send, change, or delete content.',
|
||
'settings.computerUse.enableRiskAllApps': 'Once enabled, Claude can control all supported applications without asking for permission app by app. Product safety restrictions still apply.',
|
||
'settings.computerUse.enableRiskStop': 'You can interrupt control at any time with Stop or Esc, and disable Computer Use here.',
|
||
'settings.computerUse.enableRiskMacos': 'macOS still requires the system-level Accessibility and Screen Recording permissions. Those operating-system prompts are separate from app authorization.',
|
||
'settings.computerUse.enableRiskConfirm': 'Enable Computer Use',
|
||
'settings.computerUse.disabledHint': 'Computer Use is off. New sessions will not inject the computer-use MCP server or expose desktop-control tools to the Coding Agent.',
|
||
'settings.computerUse.notSupported': 'Computer Use is only supported on macOS and Windows.',
|
||
'settings.computerUse.macosUnsupportedTitle': 'Computer Use requires macOS {version} or later',
|
||
'settings.computerUse.macosUnsupportedDetail': 'This Mac is running macOS {current}. The rest of the app remains available.',
|
||
'settings.computerUse.unknownVersion': 'an unknown version',
|
||
'settings.computerUse.macosDetectionFailedTitle': 'Unable to verify the macOS version',
|
||
'settings.computerUse.macosDetectionFailedDetail': 'Computer Use could not verify that this Mac meets the macOS 14.4 requirement. Recheck the status.',
|
||
'settings.computerUse.nativeUnavailableTitle': 'Computer Use runtime is unavailable',
|
||
'settings.computerUse.nativeUnavailableDetail': 'The native runtime is missing or could not be prepared. Recheck after reinstalling or updating the app.',
|
||
'settings.computerUse.configLoadFailed': 'Could not load the saved Computer Use setting.',
|
||
'settings.computerUse.configSaveFailed': 'Could not save the Computer Use setting. The previous value was restored.',
|
||
'settings.computerUse.python': 'Python 3',
|
||
'settings.computerUse.pythonNotFound': 'Not installed. Please install Python 3 first.',
|
||
'settings.computerUse.pythonFound': 'Installed',
|
||
'settings.computerUse.pythonCustomInvalid': 'Custom interpreter unavailable',
|
||
'settings.computerUse.pythonPathLabel': 'Python Interpreter Path',
|
||
'settings.computerUse.pythonPathPlaceholder': 'Auto-detect, or choose python.exe / python3',
|
||
'settings.computerUse.pythonPathHint': 'Leave empty to auto-detect. Choose the Python executable from conda, pyenv, or another custom environment to prefer it for runtime setup.',
|
||
'settings.computerUse.pythonPathBrowse': 'Browse',
|
||
'settings.computerUse.pythonPathSave': 'Apply',
|
||
'settings.computerUse.pythonPathAuto': 'Auto',
|
||
'settings.computerUse.pythonPathSaved': 'Saved. Rechecks will prefer this interpreter.',
|
||
'settings.computerUse.pythonPathSaveFailed': 'Save failed. Try again.',
|
||
'settings.computerUse.pythonPathDialogTitle': 'Select Python Interpreter',
|
||
'settings.computerUse.pythonPathDialogFailed': 'Could not open the file picker. Paste the path manually.',
|
||
'settings.computerUse.venv': 'Virtual Environment',
|
||
'settings.computerUse.venvReady': 'Ready',
|
||
'settings.computerUse.venvNotReady': 'Not created',
|
||
'settings.computerUse.deps': 'Dependencies',
|
||
'settings.computerUse.depsReady': 'Installed',
|
||
'settings.computerUse.depsNotReady': 'Not installed',
|
||
'settings.computerUse.accessibility': 'Accessibility Permission',
|
||
'settings.computerUse.screenRecording': 'Screen Recording Permission',
|
||
'settings.computerUse.permGranted': 'Granted',
|
||
'settings.computerUse.permDenied': 'Denied — open System Settings > Privacy & Security to grant',
|
||
'settings.computerUse.permUnknown': 'Setup environment first to check',
|
||
'settings.computerUse.permScreenRecordingUnknownSoft': 'Auto-detection can be unreliable here; if System Settings already shows it enabled, Computer Use can usually proceed',
|
||
'settings.computerUse.permScreenRecordingManual': 'Cannot auto-detect — please verify in System Settings',
|
||
'settings.computerUse.setupBtn': 'Install Environment',
|
||
'settings.computerUse.setupRunning': 'Installing...',
|
||
'settings.computerUse.setupSuccess': 'Environment setup complete!',
|
||
'settings.computerUse.setupFail': 'Setup failed',
|
||
'settings.computerUse.allReady': 'All checks passed. Computer Use is ready.',
|
||
'settings.computerUse.downloadPython': 'Download Python 3',
|
||
'settings.computerUse.recheckBtn': 'Recheck Status',
|
||
'settings.computerUse.requirementsLabel': 'Required packages',
|
||
'settings.computerUse.appsTitle': 'Authorized Apps',
|
||
'settings.computerUse.appsDescription': 'Pre-authorize apps for Computer Use. Authorized apps can be controlled by Claude without runtime prompts.',
|
||
'settings.computerUse.appsLoading': 'Loading installed apps...',
|
||
'settings.computerUse.appsEmpty': 'No installed apps found. Please setup the environment first.',
|
||
'settings.computerUse.appsSearch': 'Search apps...',
|
||
'settings.computerUse.appsSaved': 'Saved',
|
||
'settings.computerUse.openAccessibility': 'Open Accessibility Settings',
|
||
'settings.computerUse.openScreenRecording': 'Open Screen Recording Settings',
|
||
'settings.computerUse.permRestartHint': 'After granting, restart the app for it to take effect.',
|
||
'settings.computerUse.flagClipboard': 'Clipboard Access',
|
||
'settings.computerUse.flagSystemKeys': 'System Key Combos',
|
||
// Computer Use — native (cu-helper) Codex-style page
|
||
'settings.computerUse.controlTitle': 'Computer Control',
|
||
'settings.computerUse.controlSubtitle': 'Manage how Claude uses other applications on your computer',
|
||
'settings.computerUse.sectionControl': 'Control',
|
||
'settings.computerUse.anyApp': 'Any App',
|
||
'settings.computerUse.anyAppDesc': 'Allow Claude to control apps on your computer',
|
||
'settings.computerUse.osPermTitle': 'System Permissions',
|
||
'settings.computerUse.osPermHint': 'Once enabled, Claude can click, type, and take screenshots on your computer. Your real mouse will not be taken over.',
|
||
'settings.computerUse.openCard': 'Reopen authorization card',
|
||
'settings.computerUse.openingCard': 'Opening authorization card…',
|
||
'settings.computerUse.openCardFailed': 'Could not open the authorization card. Please try again later.',
|
||
'settings.computerUse.permNeeded': 'Needs authorization',
|
||
'settings.computerUse.permChecking': 'Checking…',
|
||
'settings.computerUse.permCheckFailed': 'Check failed',
|
||
'settings.computerUse.allowedAppsTitle': 'Always-Allowed Apps',
|
||
'settings.computerUse.allowedAppsDesc': 'These apps are authorized — Claude can control them directly without confirming each time.',
|
||
'settings.computerUse.allowedAppsEmpty': 'No always-allowed apps yet. Click “Add App” to authorize your first one.',
|
||
'settings.computerUse.addApp': 'Add App',
|
||
'settings.computerUse.addAppTitle': 'Choose an app to authorize',
|
||
'settings.computerUse.removeApp': 'Remove',
|
||
'settings.computerUse.appsPickerEmpty': 'No apps available to add.',
|
||
'settings.computerUse.appsPickerLoading': 'Loading installed apps…',
|
||
|
||
// Settings > General - Storage
|
||
'settings.general.modeSwitchTitle': 'Switch data storage location?',
|
||
'settings.general.modeSwitchConfirm': 'Save and Restart',
|
||
'settings.general.sessionRetentionTitle': 'Session History',
|
||
'settings.general.sessionRetentionDescription': 'How long transcripts are kept on this device. Lowering the value deletes older sessions right away, so it asks for confirmation first.',
|
||
'settings.general.sessionRetentionLabel': 'Keep session history for',
|
||
'settings.general.sessionRetentionCurrent': 'Current: {days} days',
|
||
'settings.general.sessionRetentionCurrentOff': 'Current: not saved',
|
||
'settings.general.sessionRetentionUnit': 'days',
|
||
'settings.general.sessionRetentionHint': 'Default is 365 days. Setting this to 0 stops recording session content and deletes every existing transcript.',
|
||
'settings.general.sessionRetentionRequired': 'Enter a number of days.',
|
||
'settings.general.sessionRetentionRange': 'Enter a whole number from 0 to {max}.',
|
||
'settings.general.sessionRetentionSave': 'Save',
|
||
'settings.general.sessionRetentionSaved': 'Retention updated. {count} old session files removed.',
|
||
'settings.general.sessionRetentionSavedPartial': 'Retention updated. {count} old session files removed, {errors} could not be removed.',
|
||
'settings.general.sessionRetentionConfirmTitle': 'Change session history retention?',
|
||
'settings.general.sessionRetentionConfirmDelete': 'Sessions older than {days} days will be permanently deleted. This cannot be undone.',
|
||
'settings.general.sessionRetentionConfirmDisable': 'Setting this to 0 stops recording new session content and permanently deletes every existing transcript. This cannot be undone.',
|
||
'settings.general.sessionRetentionPreview': '{count} files currently match this cutoff.',
|
||
'settings.general.sessionRetentionPreviewUnavailable': 'Could not count matching files. You can still confirm.',
|
||
'settings.general.sessionRetentionConfirmAction': 'Delete and save',
|
||
'settings.general.storageTitle': 'Data Storage Location',
|
||
'settings.general.storageDescription': 'Advanced, low-frequency setting. After switching, sessions, Skills, MCP, plugins, provider settings, tasks, and caches are read from the new directory.',
|
||
'settings.general.storageSystemTitle': 'Use system directory',
|
||
'settings.general.storageSystemDescription': "Use Claude Code's standard user directory: ~/.claude (on Windows, %USERPROFILE%\\.claude).",
|
||
'settings.general.storagePortableTitle': 'Use custom directory',
|
||
'settings.general.storagePortableDescription': 'Store desktop data in one explicit folder you choose. It must be an absolute path outside the app installation directory.',
|
||
'settings.general.storagePortableDirLabel': 'Custom data directory',
|
||
'settings.general.storagePortableDirPlaceholder': 'Choose a folder for cc-haha data',
|
||
'settings.general.storageChooseDir': 'Choose Folder',
|
||
'settings.general.storageChooseDirTitle': 'Choose custom data directory',
|
||
'settings.general.storageApplyPortable': 'Use This Folder and Restart',
|
||
'settings.general.storageActiveDir': 'Current active data directory',
|
||
'settings.general.storageEnvironmentHint': 'The current directory is controlled by the CLAUDE_CONFIG_DIR environment variable. In-app switching cannot override it; remove CLAUDE_CONFIG_DIR from the launch environment to return to the system directory.',
|
||
'settings.general.storageEnvironmentSwitchBlocked': 'CLAUDE_CONFIG_DIR currently controls the data directory. Remove it from the launch environment before switching back to the system directory.',
|
||
'settings.general.storageRestartHint': 'The storage change has been saved. Restart the app for the new data directory to take effect.',
|
||
'settings.general.storageMoveHint': 'Switching modes does not merge directories. On Windows, upgrades recover verified legacy app-adjacent data before uninstalling; if recovery cannot be verified, the upgrade stops.',
|
||
'settings.general.storageNoDirError': 'Choose or enter a custom data directory first.',
|
||
'settings.general.storagePickerError': 'Could not open the folder picker. Paste the folder path manually.',
|
||
'settings.general.storageRestartError': 'The change was saved, but automatic restart failed. Restart the app manually.',
|
||
'settings.general.storageSwitchPortableBody': 'After switching, the desktop app will read and write sessions, settings, Skills, MCP, plugins, tasks, and caches in this directory.',
|
||
'settings.general.storageSwitchDefaultBody': 'After switching back, the desktop app will use ~/.claude again. Data in the custom directory is not deleted or moved back automatically.',
|
||
'settings.general.storageSwitchRestartBody': 'The app will stop the local server and adapter processes, then relaunch. The new directory takes effect after restart.',
|
||
|
||
'settings.general.migration.title': 'Migrate existing data',
|
||
'settings.general.migration.description': 'Copy and verify your current sessions, settings, Skills, plugins and tasks, then switch directories and restart. The original data is kept.',
|
||
'settings.general.migration.choose': 'Migrate Existing Data…',
|
||
'settings.general.migration.chooseTitle': 'Choose a migration destination',
|
||
'settings.general.migration.confirmTitle': 'Migrate data and restart?',
|
||
'settings.general.migration.confirm': 'Migrate and Restart',
|
||
'settings.general.migration.source': 'Original directory',
|
||
'settings.general.migration.target': 'New directory',
|
||
'settings.general.migration.preview': '{files} files · {size}',
|
||
'settings.general.migration.activeTasks': '{count} running tasks will be stopped.',
|
||
'settings.general.migration.stopWarning': 'Running conversations and background tasks will be interrupted and saved before copying. They will not resume automatically. The app restarts after verification succeeds.',
|
||
'settings.general.migration.externalWarning': 'Close other Claude Code or cc-haha processes using the original directory before continuing. Choose an empty folder outside the app installation directory.',
|
||
'settings.general.migration.running': 'Data migration in progress',
|
||
'settings.general.migration.stagePreparing': 'Preparing migration…',
|
||
'settings.general.migration.stageQuiescing': 'Stopping tasks and saving data…',
|
||
'settings.general.migration.stageCopying': 'Copying data…',
|
||
'settings.general.migration.stageVerifying': 'Verifying copied data…',
|
||
'settings.general.migration.stageCommitting': 'Switching data directory…',
|
||
'settings.general.migration.stageRestarting': 'Restarting the app…',
|
||
'settings.general.migration.progress': '{files}/{totalFiles} files · {bytes}/{totalBytes}',
|
||
'settings.general.migration.cancel': 'Cancel migration',
|
||
'settings.general.migration.cancelling': 'Cancelling migration…',
|
||
'settings.general.migration.completed': 'Data migration completed',
|
||
'settings.general.migration.cancelled': 'Migration cancelled. The original data directory is unchanged.',
|
||
'settings.general.migration.failed': 'Migration failed. The original data directory is kept.',
|
||
'settings.general.migration.retained': 'The original directory is retained. Check your sessions and settings in the new directory before manually cleaning up the original data.',
|
||
'settings.general.migration.cli': 'This changes the desktop app only. A separately launched CLI keeps its current directory unless you set CLAUDE_CONFIG_DIR to the new location.',
|
||
'settings.general.migration.openSource': 'Open Original Directory',
|
||
'settings.general.migration.openTarget': 'Open New Directory',
|
||
'settings.general.migration.environment': 'Remove CLAUDE_CONFIG_DIR from the launch environment before using in-app migration.',
|
||
'settings.general.migration.statusError': 'Could not read migration progress. Reconnecting automatically…',
|
||
'settings.general.migration.error': 'Data migration could not continue.',
|
||
|
||
// Settings > General
|
||
'settings.general.appearanceTitle': 'Appearance',
|
||
'settings.general.proxyManagedSettingsWarning': 'Your user settings contain only a PROXY_MANAGED proxy placeholder, so another proxy tool may have replaced the remaining settings. If this was not intentional, disable CC Switch routing takeover and restore settings.json from a backup. Otherwise, you can ignore this notice.',
|
||
'settings.general.appearanceDescription': 'Switch between the six paper and ink palettes.',
|
||
'settings.general.appearance.paper': 'Paper',
|
||
'settings.general.appearance.warmClassic': 'Warm Classic',
|
||
'settings.general.appearance.celadon': 'Celadon',
|
||
'settings.general.appearance.inkBlue': 'Ink Blue',
|
||
'settings.general.appearance.dark': 'Ink Night',
|
||
'settings.general.appearance.white': 'Pure White',
|
||
'settings.general.appearance.followSystem': 'Follow the system',
|
||
'settings.general.appearance.followSystemHint': 'Switch to an ink palette when the system turns dark, and back to a paper one when it turns light.',
|
||
'settings.general.appearance.lightThemeLabel': 'Use in light mode',
|
||
'settings.general.appearance.darkThemeLabel': 'Use in dark mode',
|
||
'settings.general.languageTitle': 'Language',
|
||
'settings.general.languageDescription': 'Choose the display language for the application.',
|
||
'settings.general.responseLangTitle': 'Response Language',
|
||
'settings.general.responseLangDescription': 'Instruct Claude to always respond in a specific language.',
|
||
'settings.general.responseLangDefault': 'Default (English)',
|
||
'settings.general.outputStyleTitle': 'Output Style',
|
||
'settings.general.outputStyleDescription': 'Choose how Claude communicates in new or restarted sessions.',
|
||
'settings.general.outputStyleBuiltin.default.label': 'Default',
|
||
'settings.general.outputStyleBuiltin.default.description': 'Claude completes coding tasks efficiently and provides concise responses',
|
||
'settings.general.outputStyleBuiltin.explanatory.label': 'Explanatory',
|
||
'settings.general.outputStyleBuiltin.explanatory.description': 'Claude explains its implementation choices and codebase patterns',
|
||
'settings.general.outputStyleBuiltin.learning.label': 'Learning',
|
||
'settings.general.outputStyleBuiltin.learning.description': 'Claude pauses and asks you to write small pieces of code for hands-on practice',
|
||
'settings.general.outputStyleSelectLabel': 'Select output style',
|
||
'settings.general.outputStyleLoading': 'Loading output styles...',
|
||
'settings.general.outputStyleSaved': 'Output style saved.',
|
||
'settings.general.outputStyleRestartHint': 'Running sessions keep their current prompt. Start a new session, continue in a fresh process, or restart the session for this to apply.',
|
||
'settings.general.outputStyleScopeLocal': 'Current project',
|
||
'settings.general.outputStyleScopeUser': 'User settings',
|
||
'settings.general.outputStyleScopeLocalHint': 'Saved to .claude/settings.local.json for the active project.',
|
||
'settings.general.outputStyleScopeUserHint': 'Saved to your user settings because no active project is selected.',
|
||
'settings.general.outputStyleSourceBuiltIn': 'Built-in',
|
||
'settings.general.outputStyleSourceUser': 'User style',
|
||
'settings.general.outputStyleSourceProject': 'Project style',
|
||
'settings.general.outputStyleSourceLocal': 'Local project style',
|
||
'settings.general.outputStyleSourcePolicy': 'Managed style',
|
||
'settings.general.outputStyleSourcePlugin': 'Plugin style',
|
||
'settings.general.defaultPermissionTitle': 'Default Session Permissions',
|
||
'settings.general.defaultPermissionDescription': 'Choose the permission mode applied when a new desktop chat session starts.',
|
||
'settings.general.defaultPermissionLabel': 'New session permission mode',
|
||
'settings.general.defaultPermissionHint': 'Individual sessions can still be changed from the chat permission selector.',
|
||
'settings.general.defaultPermissionScope': 'Each new session workspace',
|
||
'settings.general.effortTitle': 'Effort Level',
|
||
'settings.general.effortDescription': 'Choose the default reasoning effort for new sessions. Available levels follow the active model\'s capability profile.',
|
||
'settings.general.effortDefaultLabel': 'Default reasoning effort',
|
||
'settings.general.effortSelectLabel': 'Default reasoning effort: {level}',
|
||
'settings.general.effortModelHint': '{model} only shows the levels it supports. Other models fall back to their own default.',
|
||
'settings.general.effortNoModelHint': 'Connect or select a model to see its supported reasoning levels.',
|
||
'settings.general.effortUnavailable': 'Not adjustable',
|
||
'settings.general.effort.low': 'Low',
|
||
'settings.general.effort.medium': 'Medium',
|
||
'settings.general.effort.high': 'High',
|
||
'settings.general.effort.xhigh': 'X-High',
|
||
'settings.general.effort.max': 'Max',
|
||
'settings.general.thinkingTitle': 'Thinking Mode',
|
||
'settings.general.thinkingDescription': 'Controls whether new sessions start with model thinking enabled. When off, compatible providers such as DeepSeek receive an explicit non-thinking parameter.',
|
||
'settings.general.thinkingEnabled': 'Enable thinking mode',
|
||
'settings.general.thinkingHint': 'Turn this off to start new sessions with --thinking disabled; useful for DeepSeek V4 Flash/Pro and other non-thinking workflows.',
|
||
'settings.general.defaultEditorTitle': 'Default editor',
|
||
'settings.general.defaultEditorDescription': 'Which editor the Open With menu offers for a file. Only editors found on this machine are listed.',
|
||
'settings.general.defaultEditorAuto': 'Automatic',
|
||
'settings.general.agentTeamsTitle': 'Agent Teams',
|
||
'settings.general.agentTeamsDescription': 'Let multiple agents divide tasks and collaborate as a team.',
|
||
'settings.general.agentTeamsEnabled': 'Enable Agent Teams',
|
||
'settings.general.agentTeamsHint': 'Applies to new sessions. Restart the app to apply changes to existing sessions.',
|
||
'settings.general.autoQuestionTitle': 'Automatic question answers',
|
||
'settings.general.autoQuestionDescription': 'Continue a session when nobody answers an AskUserQuestion prompt.',
|
||
'settings.general.autoQuestionEnabled': 'Answer questions automatically after a timeout',
|
||
'settings.general.autoQuestionHint': 'Use an explicitly recommended option first. Otherwise, ask a small model to choose from the listed options. If it cannot decide, the question stays open.',
|
||
'settings.general.autoQuestionTimeout': 'Wait before answering',
|
||
'settings.general.autoQuestionMinutes': '{count} minutes',
|
||
'settings.general.autoQuestionSaveFailed': 'Could not save automatic question answers.',
|
||
'settings.general.agentTeamsSaveFailed': 'Failed to save Agent Teams settings. Please try again.',
|
||
'settings.general.workflowKeywordTitle': 'Ultracode',
|
||
'settings.general.workflowKeywordDescription': 'Controls whether a standalone Ultracode keyword opts the prompt into dynamic Workflow orchestration.',
|
||
'settings.general.workflowKeywordEnabled': 'Enable Ultracode keyword trigger',
|
||
'settings.general.workflowKeywordHint': 'Actionable keywords are highlighted before send; code blocks, quotes, paths, flags, and hyphenated literals stay literal.',
|
||
'settings.general.autoDreamTitle': 'Auto-dream',
|
||
'settings.general.autoDreamDescription': 'Periodically consolidates auto-memory in the background after enough sessions have changed.',
|
||
'settings.general.autoDreamEnabled': 'Enable Auto-dream',
|
||
'settings.general.autoDreamHintOn': 'The desktop app can run memory consolidation after eligible sessions finish.',
|
||
'settings.general.autoDreamHintOff': 'Off by default because it can run background model calls.',
|
||
'settings.general.autoDreamConfirmTitle': 'Enable Auto-dream?',
|
||
'settings.general.autoDreamConfirmKeepRunning': 'Keep the desktop app running so background memory consolidation can start after eligible sessions finish.',
|
||
'settings.general.autoDreamConfirmTokenCost': 'Auto-dream uses additional model tokens when it reviews and rewrites memory files.',
|
||
'settings.general.autoDreamConfirmEnable': 'Enable Auto-dream',
|
||
'settings.general.notificationsTitle': 'System Notifications',
|
||
'settings.general.notificationsDescription': 'Use native OS notifications for permission prompts, agent replies, and scheduled task results.',
|
||
'settings.general.notificationsEnabled': 'Enable system notifications',
|
||
'settings.general.notificationsHintOn': 'When enabled, the app will request notification permission and use the OS notification center.',
|
||
'settings.general.notificationsHintOff': 'When disabled, permission prompts, agent replies, and scheduled tasks will not send desktop notifications.',
|
||
'settings.general.notificationsStatus': 'Permission',
|
||
'settings.general.notificationsStatusGranted': 'Granted',
|
||
'settings.general.notificationsStatusDenied': 'Blocked by system settings',
|
||
'settings.general.notificationsStatusDefault': 'Not requested',
|
||
'settings.general.notificationsStatusUnsupported': 'Unavailable in this environment',
|
||
'settings.general.notificationsAuthorize': 'Authorize',
|
||
'settings.general.notificationsOpenSettings': 'Open Settings',
|
||
'settings.general.notificationsTestTitle': 'Claude Code Haha notifications are enabled',
|
||
'settings.general.notificationsTestBody': 'Permission prompts and completed agent replies will now use system notifications.',
|
||
'settings.general.traceTitle': 'Agent trace',
|
||
'settings.general.traceDescription': 'Collect local model request traces for stuck sessions, failed calls, and unexpected waits.',
|
||
'settings.general.traceEnabled': 'Collect agent traces',
|
||
'settings.general.traceHintOn': 'New sessions write compact requests, responses, and status events to the local cc-haha traces directory. Open an assistant row in the session\'s Trajectory view and switch to Raw request to inspect them.',
|
||
'settings.general.traceHintOff': 'No new requests will be recorded. Existing records stay available under Raw request in each session\'s Trajectory view.',
|
||
'settings.general.chatSendBehaviorTitle': 'Message Sending',
|
||
'settings.general.chatSendBehaviorDescription': 'Choose how the desktop chat composer submits messages.',
|
||
'settings.general.chatSendBehaviorEnter': 'Enter sends',
|
||
'settings.general.chatSendBehaviorEnterDescription': 'Shift+Enter inserts a new line.',
|
||
'settings.general.chatSendBehaviorModifier': 'Ctrl/Cmd+Enter sends',
|
||
'settings.general.chatSendBehaviorModifierDescription': 'Enter and Shift+Enter insert new lines.',
|
||
'settings.general.h5AccessTitle': 'H5 Access',
|
||
'settings.general.h5AccessDescription': 'Expose the desktop H5 app on your local network. Phones connect with a QR link that includes a short-lived H5 token.',
|
||
'settings.general.h5AccessEnabled': 'Enable H5 access',
|
||
'settings.general.h5AccessEnabledHint': 'The desktop server listens on the LAN address and allows access to desktop sessions.',
|
||
'settings.general.h5AccessStatusEnabled': 'Enabled',
|
||
'settings.general.h5AccessTokenPreview': 'Token preview',
|
||
'settings.general.h5AccessDisabledValue': 'Disabled',
|
||
'settings.general.h5AccessDisable': 'Disable',
|
||
'settings.general.h5AccessGenerateToken': 'Generate token',
|
||
'settings.general.h5AccessRegenerate': 'Regenerate token',
|
||
'settings.general.h5AccessGeneratedToken': 'Generated token',
|
||
'settings.general.h5AccessGeneratedTokenHint': 'Shown once. Copy it now and store it like a password.',
|
||
'settings.general.h5AccessShowToken': 'Show token',
|
||
'settings.general.h5AccessCopy': 'Copy',
|
||
'settings.general.h5AccessCopyUrl': 'Copy H5 URL',
|
||
'settings.general.h5AccessCopyLaunchUrl': 'Copy QR link',
|
||
'settings.general.h5AccessUrlCopied': 'H5 URL copied.',
|
||
'settings.general.h5AccessLaunchUrlCopied': 'QR link copied.',
|
||
'settings.general.h5AccessHideToken': 'Hide token',
|
||
'settings.general.h5AccessTokenNotAvailable': 'Tokens from older versions cannot be recovered. Regenerate once and the token will be kept permanently and stay viewable.',
|
||
'settings.general.h5AccessPublicHost': 'Access host / IP',
|
||
'settings.general.h5AccessPublicHostPlaceholder': '192.168.1.100',
|
||
'settings.general.h5AccessCurrentPort': 'Current port',
|
||
'settings.general.h5AccessCurrentPortUnknown': 'Auto',
|
||
'settings.general.h5AccessFixedPort': 'Fixed port',
|
||
'settings.general.h5AccessFixedPortPlaceholder': 'Auto',
|
||
'settings.general.h5AccessFixedPortInvalid': 'Port must be a browser-safe integer between 1024 and 65535.',
|
||
'settings.general.h5AccessFixedPortHint': 'Without a fixed port the previous port is reused automatically; pin one for reverse proxies and other setups that need a stable port. Port changes apply after restarting the app.',
|
||
'settings.general.h5AccessFixedPortRestartNote': 'Fixed port {fixedPort} takes effect after restarting the app; currently still running on {activePort}.',
|
||
'settings.general.h5AccessDisconnectGrace': 'Disconnect grace (sec)',
|
||
'settings.general.h5AccessDisconnectGracePlaceholder': '30',
|
||
'settings.general.h5AccessDisconnectGraceInvalid': 'Must be an integer between 5 and 86400 seconds.',
|
||
'settings.general.h5AccessDisconnectGraceHint': 'When a phone locks its screen or backgrounds the app and disconnects, a running task is never interrupted — it finishes in the background and the result shows on reconnect. The CLI is only stopped after this idle period once the task is done and no client is attached (default 30s). Raise it for remote use on the go, e.g. 600.',
|
||
'settings.general.h5AccessPublicUrl': 'Public URL',
|
||
'settings.general.h5AccessPublicUrlPlaceholder': 'https://chat.example.com',
|
||
'settings.general.h5AccessAllowedOrigins': 'Allowed origins',
|
||
'settings.general.h5AccessAllowedOriginsPlaceholder': 'https://chat.example.com, https://phone.example',
|
||
'settings.general.h5AccessOriginsHint': 'Enter one origin per line or separate multiple origins with commas.',
|
||
'settings.general.h5AccessOpenHint': 'For LAN access, change only the host / IP; the current service port is reused. Enter a full URL for reverse proxies.',
|
||
'settings.general.h5AccessSave': 'Save H5 settings',
|
||
'settings.general.h5AccessUrl': 'H5 URL',
|
||
'settings.general.h5AccessQrTitle': 'Phone connection',
|
||
'settings.general.h5AccessQrHint': 'Scan to open H5 with the token already filled in.',
|
||
'settings.general.h5AccessQrRefreshHint': 'Click Generate token to create a QR link that can be scanned.',
|
||
'settings.general.h5AccessQrEmptyHint': 'Generate a token to create the QR code.',
|
||
'settings.general.h5AccessQrAlt': 'H5 access QR code',
|
||
'settings.general.h5AccessSafetyNote': 'Only enable this on trusted networks. Anyone with the QR link can reach the desktop capabilities exposed by H5.',
|
||
'settings.general.h5AccessConfirmTitle': 'Enable LAN H5 access?',
|
||
'settings.general.h5AccessConfirmBody': 'This will expose the desktop H5 app on your LAN address and port. Devices with the QR token can access desktop sessions and related controls. Continue only on a trusted network.',
|
||
'settings.general.h5AccessConfirmEnable': 'Enable H5 access',
|
||
'settings.general.h5AccessError': 'Failed to update H5 access settings.',
|
||
'settings.general.h5AccessStaleHostTitle': 'Saved H5 host is no longer reachable',
|
||
'settings.general.h5AccessStaleHostBody': 'The saved host {storedHost} is not bound to any active interface on this machine. Phones scanning the QR code will fail to connect. We recommend switching to the current LAN IP.',
|
||
'settings.general.h5AccessStaleHostNoSuggestion': 'The saved host {storedHost} is not bound to any active interface on this machine. Phones scanning the QR code will fail to connect. Please check this machine’s network connection, or switch to a reverse proxy URL.',
|
||
'settings.general.h5AccessStaleHostApply': 'Switch to {suggestedHost}',
|
||
'settings.general.h5AccessProxyNote': 'Currently using a reverse proxy URL. Phones reach the desktop through the public domain / tunnel you configured. Make sure your proxy is still up.',
|
||
'settings.general.networkTitle': 'Network',
|
||
'settings.general.networkDescription': 'Controls outbound network access for desktop AI sessions, including providers, sign-in, MCP, and agent tools.',
|
||
'settings.general.networkProxyModeDirect': 'Direct connection',
|
||
'settings.general.networkProxyModeDirectDescription': 'Explicitly bypass system and inherited proxy settings.',
|
||
'settings.general.networkProxyModeSystem': 'System proxy',
|
||
'settings.general.networkProxyModeSystemDescription': 'Follow OS proxy or PAC routing per destination and pick up changes automatically. Use Manual proxy when credentials are required.',
|
||
'settings.general.networkProxyModeManual': 'Manual proxy',
|
||
'settings.general.networkProxyModeManualDescription': 'Route session traffic through the HTTP or HTTPS proxy URL entered below.',
|
||
'settings.general.networkProxyUrl': 'Proxy URL',
|
||
'settings.general.networkProxyUrlHint': 'HTTP and HTTPS proxy URLs are supported. For authenticated proxies, use http://user:password@127.0.0.1:7890; the URL is saved with network settings.',
|
||
'settings.general.networkProxyUrlInvalid': 'Enter an HTTP or HTTPS proxy URL.',
|
||
'settings.general.networkProxyUrlRequired': 'Enter a proxy URL.',
|
||
'settings.general.networkTimeout': 'AI request timeout',
|
||
'settings.general.networkTimeoutValue': '{seconds}s',
|
||
'settings.general.networkTimeoutHint': 'Applies to provider requests, streaming first responses, and provider connection tests. Minimum 30 seconds; for local models with long thinking times, set 14400 seconds (4 hours) or longer. Raising it also extends the overall time limit for a single streamed response (never below 600 seconds).',
|
||
'settings.general.networkTimeoutUnit': 'sec',
|
||
'settings.general.networkTimeoutDecrease': 'Decrease by 30 seconds',
|
||
'settings.general.networkTimeoutIncrease': 'Increase by 30 seconds',
|
||
'settings.general.networkTimeoutRequired': 'Enter a timeout.',
|
||
'settings.general.networkTimeoutRange': 'Enter a whole number from {min} to {max} seconds.',
|
||
'settings.general.networkSaved': 'Network settings saved.',
|
||
'settings.general.networkScopeHint': 'Applies to new requests; an in-flight request keeps its current route. App updates use a separate proxy setting.',
|
||
'settings.general.networkSave': 'Save',
|
||
'settings.general.webFetchPreflightTitle': 'WebFetch Preflight',
|
||
'settings.general.webFetchPreflightDescription': 'Desktop sessions skip Claude\'s domain preflight by default to avoid false failures on third-party providers and restricted networks.',
|
||
'settings.general.webFetchPreflightEnabled': 'Skip WebFetch domain preflight',
|
||
'settings.general.webFetchPreflightHint': 'Turn this off only if you explicitly want to restore the upstream safety preflight before each WebFetch request.',
|
||
'settings.general.webSearchTitle': 'WebSearch',
|
||
'settings.general.webSearchDescription': 'Choose how agent web search is resolved across official Claude, third-party providers, and local fallback keys.',
|
||
'settings.general.webSearch.mode.auto': 'Auto',
|
||
'settings.general.webSearch.mode.tavily': 'Tavily',
|
||
'settings.general.webSearch.mode.brave': 'Brave',
|
||
'settings.general.webSearch.mode.anthropic': 'Claude',
|
||
'settings.general.webSearch.mode.disabled': 'Off',
|
||
'settings.general.webSearchTavilyKey': 'Tavily API key',
|
||
'settings.general.webSearchBraveKey': 'Brave Search API key',
|
||
'settings.general.webSearchBravePlaceholder': 'Brave Search token',
|
||
'settings.general.webSearchGetApiKey': 'Get API key',
|
||
'settings.general.webSearchTavilyApiKeyLink': 'Get Tavily API key',
|
||
'settings.general.webSearchBraveApiKeyLink': 'Get Brave Search API key',
|
||
'settings.general.webSearchTavilyFreeHint': 'Create an account and copy a key; the free tier includes 1000 credits.',
|
||
'settings.general.webSearchBraveFreeHint': 'Create an account to generate a Search API key with free usage for testing.',
|
||
'settings.general.webSearchHint': 'Auto uses native Claude web search for Claude model names, then falls back to Tavily and Brave keys.',
|
||
'settings.general.webSearchSave': 'Save',
|
||
'settings.general.uiZoom': 'UI Zoom',
|
||
'settings.general.uiZoomDescription': 'Adjust the size of the entire interface.',
|
||
'settings.general.uiZoomShortcutHint': 'Shortcuts are faster:',
|
||
'settings.general.uiZoomShortcutMac': 'macOS',
|
||
'settings.general.uiZoomShortcutWindows': 'Windows / Linux',
|
||
'settings.general.uiZoomShortcutResetHint': '0 resets zoom to 100%.',
|
||
'settings.general.uiZoomReset': 'Reset UI zoom to 100%',
|
||
|
||
// ─── Empty Session ──────────────────────────────────────
|
||
'empty.title': 'New session',
|
||
'empty.subtitle': 'Start a fresh coding session. Claude is ready to help you build, debug, and architect your project.',
|
||
'empty.placeholder': 'Ask anything...',
|
||
'empty.addFiles': 'Add files or photos',
|
||
'empty.slashCommands': 'Slash commands',
|
||
'empty.failedToCreate': 'Failed to create session',
|
||
'empty.createError.workdirMissing': 'The project folder is missing or is not a directory. Pick an existing project and try again.',
|
||
'empty.createError.notGit': 'This project is not a Git repository, so branch launch is unavailable. Start in the current folder or pick a Git project.',
|
||
'empty.createError.branchNotFound': 'The selected branch no longer exists. Refresh the project context and choose another branch.',
|
||
'empty.createError.dirtyWorktree': 'Current project has uncommitted changes. Direct branch switching was blocked; enable "Isolated worktree" or commit/stash your changes first.',
|
||
'empty.createError.branchCheckedOut': 'That branch is already checked out in another worktree. Enable "Isolated worktree" or choose a different branch.',
|
||
'empty.createError.worktreeCreateFailed': 'Could not create the isolated worktree. Check that Git can write to this repository, then try again. Detail: {detail}',
|
||
'empty.createError.switchFailed': 'Could not switch the current project branch. Check the Git error, keep your changes safe, then try again. Detail: {detail}',
|
||
'empty.createError.contextFailed': 'Could not inspect this Git project. Check the repository state and try again.',
|
||
|
||
// ─── Repository Launch Controls ──────────────────────────────────────
|
||
'repoLaunch.selectBranch': 'Select branch',
|
||
'repoLaunch.searchBranch': 'Search branches',
|
||
'repoLaunch.noBranch': 'No branch',
|
||
'repoLaunch.noBranchMatch': 'No matching branches',
|
||
'repoLaunch.currentBranch': 'Current branch',
|
||
'repoLaunch.localBranch': 'Local branch',
|
||
'repoLaunch.remoteBranch': 'Remote branch',
|
||
'repoLaunch.checkedOut': 'Checked out in another worktree',
|
||
'repoLaunch.worktreeCurrent': 'Current worktree',
|
||
'repoLaunch.worktreeIsolated': 'Isolated worktree',
|
||
'repoLaunch.selectWorktree': 'Select worktree mode',
|
||
'repoLaunch.launchLocation': 'Location',
|
||
'repoLaunch.branch': 'Branch',
|
||
'repoLaunch.worktreeBadge': 'Isolated',
|
||
'repoLaunch.missingWorkdir': 'Working directory is missing.',
|
||
'repoLaunch.dirtyWarning': 'Uncommitted changes detected. Direct switching may be blocked; use isolated worktree to continue without touching this folder.',
|
||
'repoLaunch.dirtyWarningCompact': 'Uncommitted changes',
|
||
'repoLaunch.checkedOutWarning': 'Selected branch is already checked out in another worktree. Direct launch may be blocked by Git; use "Isolated worktree" to avoid changing directories.',
|
||
'repoLaunch.checkedOutWarningCompact': 'Branch already checked out',
|
||
'repoLaunch.newBranch': 'Create branch…',
|
||
'repoLaunch.newBranchTitle': 'New branch',
|
||
'repoLaunch.newBranchNameLabel': 'Branch name',
|
||
'repoLaunch.newBranchPlaceholder': 'feature/my-change',
|
||
'repoLaunch.newBranchFrom': 'Starts from {branch}',
|
||
'repoLaunch.newBranchSubmit': 'Create',
|
||
'repoLaunch.newBranchSuccessCurrent': 'Created and selected “{branch}”. It will be checked out when the session starts.',
|
||
'repoLaunch.newBranchSuccessIsolated': 'Created and selected “{branch}”. An isolated worktree will be created from it when the session starts.',
|
||
'repoLaunch.newBranchErrorInvalid': 'Git will not accept this branch name.',
|
||
'repoLaunch.newBranchErrorExists': 'A branch with this name already exists.',
|
||
'repoLaunch.newBranchErrorFailed': 'Could not create the branch.',
|
||
'repoLaunch.newBranchErrorNoCommits': 'This repository has no commits yet, so there is nothing to branch from.',
|
||
|
||
// ─── Chat Input ──────────────────────────────────────
|
||
'chat.placeholder': 'Ask Claude to edit, debug or explain...',
|
||
'chat.placeholderMissing': 'This session points to a missing workspace. Create a new session or pick another project.',
|
||
'chat.placeholderWorktreeRemoved': 'This temporary workspace was cleaned up. Start a new session in the original project to continue.',
|
||
'chat.placeholderQuestionPending': 'Answer the question above first — Claude is waiting on it.',
|
||
'chat.addFiles': 'Add files or photos',
|
||
'chat.composerTools': 'Open composer tools',
|
||
'chat.capabilities.sectionAdd': 'Add',
|
||
'chat.capabilities.sectionCapabilities': 'Capabilities',
|
||
'chat.capabilities.sectionCommands': 'Commands',
|
||
'chat.capabilities.searchPlaceholder': 'Search skills, plugins, files…',
|
||
'chat.capabilities.empty': 'No matches',
|
||
'chat.capabilities.back': 'Back',
|
||
'chat.capabilities.skills': 'Skills',
|
||
'chat.capabilities.skillsDescription': 'Add a skill to this chat',
|
||
'chat.capabilities.manageSkills': 'Manage skills',
|
||
'chat.capabilities.connectors': 'Connectors',
|
||
'chat.capabilities.connectorsDescription': 'Use a connected service',
|
||
'chat.capabilities.manageConnectors': 'Manage connectors',
|
||
'chat.capabilities.agents': 'Agents',
|
||
'chat.capabilities.agentsDescription': 'Run a task with a chosen agent',
|
||
'chat.capabilities.manageAgents': 'Manage agents',
|
||
'chat.capabilities.teams': 'Agent Teams',
|
||
'chat.capabilities.teamsDescription': 'Coordinate multiple agents on one goal',
|
||
'chat.capabilities.teamCreate': 'Create a team via chat',
|
||
'chat.capabilities.teamCreateDescription': 'Describe the goal, agents do the rest',
|
||
'chat.capabilities.teamCreatePrompt': 'Create an agent team to work on the following goal. Split the work across teammates and coordinate them: ',
|
||
'chat.capabilities.teamMembers': '{count} members',
|
||
'chat.capabilities.computerUse': 'Computer use',
|
||
'chat.capabilities.computerUseDescription': 'Let Claude operate apps on this computer',
|
||
'chat.capabilities.computerUseUnsupported': 'Not available on this platform — open settings',
|
||
'chat.capabilities.computerUseToggle': 'Toggle computer use',
|
||
'chat.capabilities.workflows': 'Workflows',
|
||
'chat.capabilities.workflowsDescription': 'Run a saved workflow',
|
||
'chat.capabilities.saveWorkflow': 'Save this session as a workflow',
|
||
'chat.dropFilesTitle': 'Drop files here',
|
||
'chat.dropFilesHint': 'Attached as file paths.',
|
||
'chat.workspaceReferencesOnly': 'Added {count} workspace references',
|
||
'chat.contextReferencesOnly': 'Added {count} references',
|
||
'chat.addSelectionToChat': 'Add to chat',
|
||
'chat.imageLoadFailed': 'Unable to load image',
|
||
'chat.imageLoadFailedHint': 'The file may be missing or access may be denied.',
|
||
'chat.retryImage': 'Retry image: {name}',
|
||
'chat.imageRetrying': 'Retrying…',
|
||
'chat.branchFromHere': 'Fork a new conversation',
|
||
'chat.branchSuccess': 'Created forked conversation "{title}".',
|
||
'chat.branchError': 'Failed to branch from this message. Detail: {detail}',
|
||
'chat.userMessageReference': 'User message',
|
||
'chat.assistantMessageReference': 'Assistant message',
|
||
'chat.conversationNavigator.label': 'Conversation navigation',
|
||
'chat.conversationNavigator.turn': 'Turn {current} of {total}',
|
||
'chat.conversationNavigator.attachments': '{count} attachments',
|
||
'chat.slashCommands': 'Slash commands',
|
||
'chat.slashSkillPersonal': 'Personal',
|
||
'chat.slashSkillProject': 'Project',
|
||
'chat.slashSkillPlugin': 'Plugin',
|
||
'chat.pendingMessageGuide': 'Guide',
|
||
'chat.pendingMessageGuideNow': 'Guide now',
|
||
'chat.pendingMessageEdit': 'Edit queued message',
|
||
'chat.pendingMessageDelete': 'Delete queued message',
|
||
'chat.pendingMessageEditInput': 'Queued message text',
|
||
'chat.goalEvent.created': 'Goal set',
|
||
'chat.goalEvent.replaced': 'Goal set',
|
||
'chat.goalEvent.statusTitle': 'Goal status',
|
||
'chat.goalEvent.paused': 'Goal paused',
|
||
'chat.goalEvent.resumed': 'Goal resumed',
|
||
'chat.goalEvent.completed': 'Goal completed',
|
||
'chat.goalEvent.cleared': 'Goal cleared',
|
||
'chat.goalEvent.continuing': 'Goal continuing',
|
||
'chat.goalEvent.message': 'Goal update',
|
||
'chat.goalEvent.objective': 'Objective: {value}',
|
||
'chat.goalEvent.statusValue': 'Status: {value}',
|
||
'chat.goalEvent.budget': 'Budget: {value}',
|
||
'chat.goalEvent.continuations': 'Continuations: {value}',
|
||
'chat.compactSummary.compacting': 'Compacting context',
|
||
'chat.compactSummary.title': 'Context compacted',
|
||
'chat.compactSummary.autoTitle': 'Context automatically compacted',
|
||
'chat.compactSummary.manualTitle': 'Context manually compacted',
|
||
'chat.compactSummary.trigger.manual': 'manual',
|
||
'chat.compactSummary.trigger.auto': 'auto',
|
||
'chat.compactSummary.tokens': '{count} tokens before compact',
|
||
'chat.compactSummary.messages': '{count} messages summarized',
|
||
'chat.activeGoal.title': 'Active goal',
|
||
'chat.activeGoal.running': 'Loop running',
|
||
'chat.activeGoal.active': 'Active',
|
||
'chat.activeGoal.paused': 'Paused',
|
||
'chat.activeGoal.completed': 'Completed',
|
||
'chat.activeGoal.budget': 'Budget {value}',
|
||
'chat.activeGoal.continuations': 'Continuations {value}',
|
||
'chat.activeGoal.elapsed': 'Elapsed {value}',
|
||
'chat.backgroundAgents.title': 'Background agents',
|
||
'chat.backgroundAgents.count': '{count} active or recent',
|
||
'chat.backgroundAgents.agent': 'agent',
|
||
'chat.backgroundTasks.command': 'Background command',
|
||
'chat.backgroundTasks.workflow': 'Background workflow',
|
||
'chat.backgroundTasks.task': 'Background task',
|
||
'chat.backgroundTasks.type.agent': 'Agent',
|
||
'chat.backgroundTasks.type.bash': 'Bash',
|
||
'chat.backgroundTasks.type.workflow': 'Workflow',
|
||
'chat.backgroundTasks.type.task': 'Task',
|
||
'chat.backgroundAgents.tokens': '{count} tokens',
|
||
'chat.backgroundAgents.status.running': 'running',
|
||
'chat.backgroundAgents.status.completed': 'completed',
|
||
'chat.backgroundAgents.status.failed': 'failed',
|
||
'chat.backgroundAgents.status.stopped': 'stopped',
|
||
'chat.duration.seconds': '{seconds}s',
|
||
'chat.duration.minutesSeconds': '{minutes}m {seconds}s',
|
||
'chat.duration.hoursMinutes': '{hours}h {minutes}m',
|
||
'chat.turnCompletedAt': 'Done {time}',
|
||
'chat.turnDuration': 'took {duration}',
|
||
'slash.mcp.title': 'Available MCP tools',
|
||
'slash.mcp.subtitle': 'Global and current-project MCP servers available in this chat context.',
|
||
'slash.mcp.subtitleWithProject': 'Showing global plus project MCP for: {path}',
|
||
'slash.mcp.emptyTitle': 'No MCP servers available',
|
||
'slash.mcp.emptyBody': 'No global or project MCP servers are available for this chat context.',
|
||
'slash.mcp.projectBadge': 'Project: {name}',
|
||
'slash.skills.title': 'Available skills',
|
||
'slash.skills.subtitle': 'User-invocable skills available in the current context.',
|
||
'slash.skills.subtitleWithProject': 'Showing skills for: {path}',
|
||
'slash.skills.emptyTitle': 'No skills available',
|
||
'slash.skills.emptyBody': 'No user-invocable skills were found for this context.',
|
||
'slash.saveWorkflow.title': 'Save workflow',
|
||
'slash.saveWorkflow.subtitle': 'Save a completed workflow as a reusable slash command.',
|
||
'slash.saveWorkflow.noCompletedRun': 'Complete a workflow in this session, then use /save-workflow to save it.',
|
||
'slash.saveWorkflow.runLabel': 'Completed run',
|
||
'slash.saveWorkflow.nameLabel': 'Command name',
|
||
'slash.saveWorkflow.namePlaceholder': 'e.g. release-audit',
|
||
'slash.saveWorkflow.scopeLabel': 'Save scope',
|
||
'slash.saveWorkflow.scopeProject': 'Project',
|
||
'slash.saveWorkflow.scopeUser': 'User',
|
||
'slash.saveWorkflow.save': 'Save workflow',
|
||
'slash.saveWorkflow.loading': 'Loading workflow…',
|
||
'slash.saveWorkflow.retry': 'Retry',
|
||
'slash.saveWorkflow.success': 'Saved as /{name}. Start a new session and run /{name}.',
|
||
'slash.saveWorkflow.error': 'Could not save workflow: {detail}',
|
||
'slash.saveWorkflow.invalidName': 'Use letters, numbers, hyphens, or underscores, starting with a letter or number.',
|
||
'slash.saveWorkflow.reservedName': '/{name} is reserved by the desktop. Choose another name.',
|
||
'slash.saveWorkflow.existingName': '/{name} is already an available command. Choose another name.',
|
||
'slash.plugins.title': 'Plugins',
|
||
'slash.plugins.subtitle': 'Plugin management will move into this slash-command surface.',
|
||
'slash.plugins.emptyTitle': 'Plugins panel coming soon',
|
||
'slash.plugins.emptyBody': 'This shared slash-command panel is wired up now; plugin data will be connected next.',
|
||
'slash.help.title': 'Slash commands',
|
||
'slash.help.subtitle': 'Run agent workflows, inspect session state, or open desktop panels.',
|
||
'slash.help.group.context': 'Context',
|
||
'slash.help.group.project': 'Project',
|
||
'slash.help.group.desktop': 'Desktop',
|
||
'slash.help.group.more': 'More',
|
||
'slash.help.moreAvailable': '{count} more commands available. Type / to search the full command list.',
|
||
'slash.inspector.title': 'Session inspector',
|
||
'slash.inspector.close': 'Close session inspector',
|
||
'slash.inspector.loading': 'Loading session data',
|
||
'slash.inspector.error.noActiveSession': 'No active session selected.',
|
||
'slash.inspector.error.unavailable': 'Session inspector data is unavailable. Restart the desktop server so /api/sessions/:id/inspection is loaded.',
|
||
'slash.inspector.tab.status': 'Status',
|
||
'slash.inspector.tab.usage': 'Usage',
|
||
'slash.inspector.tab.context': 'Context',
|
||
'slash.inspector.status.cliStatus': 'CLI Status',
|
||
'slash.inspector.status.running': 'Running',
|
||
'slash.inspector.status.notRunning': 'Not running',
|
||
'slash.inspector.status.activeModel': 'Active Model',
|
||
'slash.inspector.status.unknown': 'Unknown',
|
||
'slash.inspector.status.mcpConnections': 'MCP Connections',
|
||
'slash.inspector.status.connected': 'connected',
|
||
'slash.inspector.status.failed': 'failed',
|
||
'slash.inspector.status.registeredTools': 'Registered Tools',
|
||
'slash.inspector.status.commands': 'commands',
|
||
'slash.inspector.status.sessionMetadata': 'Session metadata',
|
||
'slash.inspector.status.version': 'Version',
|
||
'slash.inspector.status.sessionId': 'Session ID',
|
||
'slash.inspector.status.workingDirectory': 'Working Directory',
|
||
'slash.inspector.status.permissionMode': 'Permission Mode',
|
||
'slash.inspector.status.authToken': 'Auth Token',
|
||
'slash.inspector.status.outputStyle': 'Output Style',
|
||
'slash.inspector.status.default': 'Default',
|
||
'slash.inspector.status.mcpServers': 'MCP servers',
|
||
'slash.inspector.status.refresh': 'Refresh',
|
||
'slash.inspector.status.contextWindow': 'Context window',
|
||
'slash.inspector.usage.emptyTitle': 'No usage data yet',
|
||
'slash.inspector.usage.emptyBody': 'Usage appears after the CLI session starts and completes at least one turn.',
|
||
'slash.inspector.usage.contextSnapshotNotice': 'Showing token usage from the current context snapshot. Usage updates dynamically as context is fetched.',
|
||
'slash.inspector.usage.transcriptNotice': 'Showing usage reconstructed from the session transcript. API duration is only available for the currently running CLI process.',
|
||
'slash.inspector.usage.unknownCost': 'Costs may be inaccurate because one or more models have unknown pricing.',
|
||
'slash.inspector.usage.totalCost': 'Total cost',
|
||
'slash.inspector.usage.source': 'Source',
|
||
'slash.inspector.usage.source.contextSnapshot': 'Context snapshot',
|
||
'slash.inspector.usage.source.transcript': 'Transcript',
|
||
'slash.inspector.usage.source.currentProcess': 'Current process',
|
||
'slash.inspector.usage.apiDuration': 'API duration',
|
||
'slash.inspector.usage.wallDuration': 'Wall duration',
|
||
'slash.inspector.usage.usageSpan': 'Usage span',
|
||
'slash.inspector.usage.codeChanges': 'Code changes',
|
||
'slash.inspector.usage.input': 'Input',
|
||
'slash.inspector.usage.output': 'Output',
|
||
'slash.inspector.usage.cacheReadWrite': 'Cache read / write',
|
||
'slash.inspector.usage.webSearch': 'Web search',
|
||
'slash.inspector.usage.byModel': 'Usage by Model',
|
||
'slash.inspector.usage.tokens': 'Tokens',
|
||
'slash.inspector.usage.noModelTitle': 'No model usage',
|
||
'slash.inspector.usage.noModelBody': 'Token usage will appear here after a model response is recorded.',
|
||
'slash.inspector.context.loading': 'Loading context data',
|
||
'slash.inspector.context.emptyTitle': 'No context data yet',
|
||
'slash.inspector.context.emptyBody': 'Context usage requires an active CLI session.',
|
||
'slash.inspector.context.windowUsage': 'Context window usage',
|
||
'slash.inspector.context.used': 'used',
|
||
'slash.inspector.context.free': 'Free',
|
||
'slash.inspector.context.messages': 'Messages',
|
||
'slash.inspector.context.assistant': 'assistant',
|
||
'slash.inspector.context.toolResults': 'Tool results',
|
||
'slash.inspector.context.context': 'Context',
|
||
'slash.inspector.context.categoryTitle': 'Estimated usage by category',
|
||
'slash.inspector.context.noCategoriesTitle': 'No context categories',
|
||
'slash.inspector.context.noCategoriesBody': 'Context categories will appear after the CLI reports context analysis.',
|
||
'slash.inspector.context.memoryFiles': 'Memory files',
|
||
'slash.inspector.context.noMemoryFiles': 'No memory files are loaded in this session.',
|
||
'slash.inspector.context.openMemory': 'Open Memory',
|
||
'contextIndicator.ariaLabel': 'Context usage {percent}',
|
||
'contextIndicator.pendingAria': 'Context usage not calculated',
|
||
'contextIndicator.loadingAria': 'Context usage loading',
|
||
'contextIndicator.unavailableAria': 'Context usage unavailable',
|
||
'contextIndicator.title': 'Context',
|
||
'contextIndicator.modelUnknown': 'Unknown model',
|
||
'contextIndicator.used': 'Used',
|
||
'contextIndicator.remaining': 'Remaining',
|
||
'contextIndicator.window': 'Window',
|
||
'contextIndicator.loading': 'Loading context usage...',
|
||
'contextIndicator.pendingDetail': 'Context usage will be calculated after the session starts.',
|
||
'contextIndicator.unavailable': 'n/a',
|
||
'contextIndicator.unavailableDetail': 'Context usage is unavailable for this session.',
|
||
'contextIndicator.updatedUnknown': 'Not refreshed yet',
|
||
'contextIndicator.updatedNow': 'Updated just now',
|
||
'contextIndicator.updatedMinutes': 'Updated {count}m ago',
|
||
'contextIndicator.estimate': 'Estimate',
|
||
'contextIndicator.breakdown': 'Breakdown',
|
||
'contextIndicator.sessionCacheHit': 'Cache hit',
|
||
'contextIndicator.sessionSpeed': 'Speed',
|
||
'contextIndicator.sessionCost': 'Session cost',
|
||
'contextIndicator.sessionSpeedUnit': 'tok/s',
|
||
'chat.navigate': 'navigate',
|
||
'chat.select': 'select',
|
||
'chat.dismiss': 'dismiss',
|
||
'chat.stopTitle': 'Stop generation (Cmd+.)',
|
||
'chat.generationStopped': 'Stopped',
|
||
'chat.jumpToLatest': 'Latest',
|
||
'chat.memorySavedTitle': 'Saved {count} memory file(s)',
|
||
'chat.memorySavedFromToolsTitle': 'Saved {count} memory item(s)',
|
||
'chat.memoryReferencedTitle': '{count} memory reference(s)',
|
||
'chat.memoryOpenSettings': 'Open Memory',
|
||
'chat.memoryMoreFiles': '+{count} more',
|
||
'chat.memoryTechnicalDetails': 'Tool details',
|
||
'chat.rewindSuccessWithCode': 'Rewound {count} messages and restored tracked files.',
|
||
'chat.rewindSuccessConversationOnly': 'Rewound {count} messages. No file checkpoint was available for this turn.',
|
||
'chat.rewindSuccessPartialCoverage': 'Rewound {count} messages and restored the checkpointed files; changes from {sources} were not checkpointed and remain on disk.',
|
||
'chat.conversationRewindAction': 'Roll back conversation',
|
||
'chat.conversationRewindConfirmBody': 'This will rewind the conversation to before this turn. Files on disk will not be changed.',
|
||
'chat.editMessage': 'Edit and resend',
|
||
'chat.editMessageInputLabel': 'Edited message',
|
||
'chat.editMessageSend': 'Send',
|
||
'chat.editAttachmentUnavailable': '{count} attachment(s) can no longer be read and will be left out when resending.',
|
||
'chat.editResendConfirmTitle': 'Edit and resend?',
|
||
'chat.editResendDropsTurns': 'The {count} later turn(s) after this message will be deleted, then the edited message is sent.',
|
||
'chat.editResendLatestBody': 'The reply to this turn will be deleted, then the edited message is sent.',
|
||
'chat.editResendRestoreChoice': '{count} file(s) were changed from this turn on. You can roll back only the conversation and keep the files on disk, or restore those files as well.',
|
||
'chat.editResendFilesUntouched': 'Files on disk will not be changed.',
|
||
'chat.editResendConversationOnly': 'Roll back conversation only and send',
|
||
'chat.editResendWithCode': 'Roll back code and conversation and send',
|
||
'chat.editResendConversation': 'Roll back conversation and send',
|
||
'chat.editResendFailed': 'Could not resend the edited message. The conversation was not changed. Details: {detail}',
|
||
'chat.editResendPrefilled': 'The conversation was rolled back, but the edited message could not be sent automatically. It is back in the input box.',
|
||
'chat.workspaceChangesFallbackLabel': 'Workspace changed files',
|
||
'chat.workspaceChangesFallbackTitle': 'Current workspace changes ({count})',
|
||
'chat.workspaceChangesFallbackExplanation': 'This conversation is too long for turn previews or file undo. This list shows current workspace changes and may include changes from other turns or outside this conversation.',
|
||
'chat.workspaceChangesFallbackUnavailable': 'This conversation is too long for turn previews or file undo. Current workspace changes could not be verified, so no file list is available.',
|
||
'chat.workspaceChangesFallbackEmpty': 'No current workspace changes were found.',
|
||
'chat.workspaceChangesFallbackOpenFile': 'Open current content of {path}',
|
||
'chat.turnChangesTitle': '{count} files changed',
|
||
'chat.turnChangesLatestCardLabel': 'Turn changed files',
|
||
'chat.turnChangesHistoricalCardLabel': 'Turn changed files',
|
||
'chat.turnChangesLatestSubtitle': 'Current turn checkpoint',
|
||
'chat.turnChangesHistoricalSubtitle': 'Saved turn checkpoint',
|
||
'chat.turnChangesCurrentWorkspaceDiff': 'Current workspace diff',
|
||
'chat.turnChangesConversationOnlySubtitle': 'Incomplete file checkpoint; undo can roll back the conversation but not the files',
|
||
'chat.turnChangesUndoConversationOnly': 'Roll back conversation only',
|
||
'chat.turnChangesConversationOnlyConfirmBody': 'This turn has an incomplete file checkpoint, so the files cannot be restored safely. Rolling back the conversation only rewinds the session to before this turn and leaves the files on disk as they are.',
|
||
'chat.turnChangesPartialCoverageSubtitle': 'Undo restores the files above; changes from {sources} were not checkpointed and will remain',
|
||
'chat.turnChangesPartialCoverageConfirmBody': 'Note: file changes made by {sources} were not checkpointed, so undo will not revert them.',
|
||
'chat.turnChangesLatestUndo': 'Undo current turn',
|
||
'chat.turnChangesHistoricalUndo': 'Rewind to before this turn',
|
||
'chat.turnChangesUndoing': 'Undoing...',
|
||
'chat.turnChangesLatestUndoAria': 'Undo current turn changes',
|
||
'chat.turnChangesHistoricalUndoAria': 'Rewind to before this turn',
|
||
'chat.turnChangesLatestConfirmTitle': 'Undo current turn?',
|
||
'chat.turnChangesHistoricalConfirmTitle': 'Rewind to before this turn?',
|
||
'chat.turnChangesLatestConfirmBody': 'This will rewind the latest assistant response and restore tracked files for this turn.',
|
||
'chat.turnChangesHistoricalConfirmBody': 'This will rewind the conversation to before this turn and restore tracked files for that checkpoint.',
|
||
'chat.turnChangesLatestConfirmUndo': 'Undo current turn',
|
||
'chat.turnChangesHistoricalConfirmUndo': 'Rewind to before this turn',
|
||
'chat.turnChangesOpenInWorkspaceAria': 'Open {path} in workspace',
|
||
'chat.turnChangesOpenFileAria': 'Open {path}',
|
||
'chat.turnChangesShowMore': 'Show {count} more files',
|
||
'chat.turnChangesExpand': 'Show {count} changed files',
|
||
'chat.turnChangesCollapse': 'Hide changed files',
|
||
'chat.turnChangesShowLess': 'Show less',
|
||
|
||
// ─── Streaming Indicator ──────────────────────────────────────
|
||
'streaming.thinking': 'Thinking',
|
||
'streaming.running': 'Running',
|
||
'streaming.working': 'Working',
|
||
|
||
// ─── Permission Dialog ──────────────────────────────────────
|
||
'permission.allowEditFile': 'Allow {actor} to {toolName} {fileName}?',
|
||
'permission.allowEditFileGeneric': 'Allow {actor} to {toolName} this file?',
|
||
'permission.allowBash': 'Allow {actor} to run this command?',
|
||
'permission.allowTool': 'Allow {actor} to use {toolName}?',
|
||
'permission.awaitingApproval': 'Awaiting approval',
|
||
'permission.responded': 'Responded',
|
||
'permission.allow': 'Allow',
|
||
'permission.allowForSession': 'Allow for session',
|
||
'permission.deny': 'Deny',
|
||
'permission.hideDetails': 'Hide details',
|
||
'permission.showFullInput': 'Show full input',
|
||
'permission.replacingContent': 'Replacing content in file',
|
||
'permission.planReadyTitle': 'Ready to code?',
|
||
'permission.planPreviewTitle': "Claude's plan",
|
||
'permission.planRequestedPermissions': 'Requested permissions',
|
||
'permission.planApprove': 'Approve plan',
|
||
'permission.planApproveAcceptEdits': 'Approve & auto-accept edits',
|
||
'permission.planApproveBypass': 'Approve & bypass permissions',
|
||
'permission.planKeepPlanning': 'Keep planning',
|
||
'permission.planFeedbackPlaceholder': 'Tell Claude what to change',
|
||
'permission.planExecutionModel': 'Execution model',
|
||
'permission.planExecutionModelPending': 'applies on approve',
|
||
'permission.planEmpty': 'No plan content available.',
|
||
'permission.planApproved': 'Plan approved',
|
||
'permission.planRejected': 'Plan rejected',
|
||
|
||
// ─── Computer Use Approval ──────────────────────────────────────
|
||
|
||
// ─── Ask User Question ──────────────────────────────────────
|
||
'question.needsInput': 'Claude needs your input',
|
||
'question.answered': 'Answered',
|
||
'question.autoAnswered': 'Answered automatically',
|
||
'question.completed': 'Completed',
|
||
'question.customResponse': 'Or type a custom response:',
|
||
'question.typePlaceholder': 'Type your answer...',
|
||
'question.submit': 'Submit',
|
||
'question.next': 'Next',
|
||
'question.answeredPrefix': 'Answered: ',
|
||
'question.resultPrefix': 'Result: ',
|
||
'question.chatAboutThis': 'Chat about this',
|
||
'question.chatAboutThisHint': 'None of these fit? Hand it back to Claude to follow up — anything already filled in comes along.',
|
||
'question.chatRequested': 'Handed back to Claude, which will follow up',
|
||
'question.chatBadge': 'Handed off',
|
||
'question.expiredBadge': 'Expired',
|
||
'question.expiredNotice': 'This question is no longer waiting for an answer, so sending delivers it to Claude as a new message.',
|
||
'question.sendAsMessage': 'Send as new message',
|
||
'question.sentAsMessagePrefix': 'Sent as a new message: ',
|
||
|
||
// ─── Thinking Block ──────────────────────────────────────
|
||
'thinking.label': 'Thinking',
|
||
'thinking.labelDone': 'Thought',
|
||
|
||
// ─── Tool Calls ──────────────────────────────────────
|
||
'tool.errorOutput': 'Error Output',
|
||
'tool.toolOutput': 'Tool Output',
|
||
'tool.toolInput': 'Tool Input',
|
||
'tool.partialInput': 'Partial input',
|
||
'tool.writerPreview': 'Writer',
|
||
'tool.writerPreviewLatest': 'Showing latest {visible} of {total} lines',
|
||
'tool.contentStats': '{lines} · {chars}',
|
||
'tool.contentStatsLatest': 'Showing latest {visible} / {total} lines · {chars}',
|
||
'tool.lineCountSingular': '{count} line',
|
||
'tool.lineCountPlural': '{count} lines',
|
||
'tool.charCountSingular': '{count} char',
|
||
'tool.charCountPlural': '{count} chars',
|
||
'tool.generatingContent': 'Generating content',
|
||
'tool.preparingEdit': 'Preparing edit',
|
||
'tool.preparingTool': 'Preparing tool',
|
||
'tool.imageGenerationGeneratingOne': 'Generating image',
|
||
'tool.imageGenerationGenerating': 'Generating {count} images',
|
||
'tool.imageGenerationEditingOne': 'Editing image',
|
||
'tool.imageGenerationEditing': 'Editing {count} image variations',
|
||
'tool.imageGenerationCompleteOne': 'Generated 1 image',
|
||
'tool.imageGenerationComplete': 'Generated {count} images',
|
||
'tool.imageGenerationEditCompleteOne': 'Edited 1 image',
|
||
'tool.imageGenerationEditComplete': 'Edited {count} image variations',
|
||
'tool.imageGenerationFailed': 'Image generation failed',
|
||
'tool.imageGenerationEditFailed': 'Image editing failed',
|
||
'tool.imageGenerationMissing': 'The provider did not return this image',
|
||
'tool.generatedImageAlt': 'Generated image {index}',
|
||
'tool.stopped': 'Stopped',
|
||
'tool.readFileContents': 'Read file contents',
|
||
'tool.createFile': 'Create file',
|
||
'tool.updateFileContents': 'Update file contents',
|
||
'tool.linesChanged': '{count} lines changed',
|
||
'tool.linesCreated': '{count} lines created',
|
||
'tool.linesOutput': '{count} lines output',
|
||
'tool.result': '{toolName} result',
|
||
'tool.resultGeneric': 'Tool result',
|
||
'tool.error': 'ERROR',
|
||
'tool.success': 'SUCCESS',
|
||
'tool.showLess': 'Show less',
|
||
'tool.showMore': 'Show {count} more characters',
|
||
'tool.showMoreLines': 'Show {count} more lines',
|
||
'tool.noOutput': 'No output',
|
||
|
||
// ─── Tool Group Verbs ──────────────────────────────────────
|
||
'toolGroup.readOne': 'Read 1 file',
|
||
'toolGroup.readMany': 'Read {count} files',
|
||
'toolGroup.createdOne': 'created a file',
|
||
'toolGroup.createdMany': 'created {count} files',
|
||
'toolGroup.editedOne': 'edited a file',
|
||
'toolGroup.editedMany': 'edited {count} files',
|
||
'toolGroup.ranOne': 'ran a command',
|
||
'toolGroup.ranMany': 'ran {count} commands',
|
||
'toolGroup.foundFiles': 'found files',
|
||
'toolGroup.searchedOne': 'searched code',
|
||
'toolGroup.searchedMany': 'searched {count} patterns',
|
||
'toolGroup.agentOne': 'dispatched an agent',
|
||
'toolGroup.agentMany': 'dispatched {count} agents',
|
||
'toolGroup.thought': 'Thinking',
|
||
'toolGroup.thoughtMany': 'Thought {count} times',
|
||
'toolGroup.failedCount': '{count} failed',
|
||
'toolGroup.collapseAgent': 'Collapse agent',
|
||
'toolGroup.expandAgent': 'Expand agent',
|
||
'toolGroup.openRun': 'Open run',
|
||
'toolGroup.openRunNamed': 'Open run {title}',
|
||
'agentStatus.starting': 'Starting',
|
||
'agentStatus.running': 'Running',
|
||
'agentStatus.done': 'Done',
|
||
'agentStatus.failed': 'Failed',
|
||
'agentStatus.stopped': 'Stopped',
|
||
'agentStatus.noActivity': 'No tool activity yet',
|
||
'agentStatus.viewResult': 'View result',
|
||
'agentStatus.resultTitle': 'Agent result',
|
||
'agentActivity.loading': 'Loading tool activity…',
|
||
'agentActivity.failed': 'Could not load this run’s tool activity.',
|
||
'agentActivity.retry': 'Retry',
|
||
'agentActivity.truncated': 'Showing the start and end of this run. Open the run for the full trace.',
|
||
'toolGroup.searchedWeb': 'searched the web',
|
||
'toolGroup.fetchedOne': 'fetched a page',
|
||
'toolGroup.fetchedMany': 'fetched {count} pages',
|
||
|
||
// ─── Tasks ──────────────────────────────────────
|
||
'tasks.completed': 'Tasks completed',
|
||
'tasks.newTask': '+ New task',
|
||
'tasks.emptyTitle': 'No scheduled tasks yet',
|
||
'tasks.emptyDesc': 'Create a recurring task to automate your engineering workflows.',
|
||
'tasks.createNew': 'Create new task',
|
||
'tasks.totalTasks': 'Total Tasks',
|
||
'tasks.active': 'Active',
|
||
'tasks.disabled': 'Disabled',
|
||
|
||
// ─── New Task Modal ──────────────────────────────────────
|
||
'newTask.title': 'New scheduled task',
|
||
'newTask.localWarning': 'Local tasks only run while your computer is awake.',
|
||
'newTask.fullPermissions': 'Full permissions (fixed)',
|
||
'newTask.time': 'Run time',
|
||
'newTask.name': 'Name',
|
||
'newTask.namePlaceholder': 'daily-code-review',
|
||
'newTask.description': 'Description',
|
||
'newTask.descPlaceholder': "Review yesterday's commits and flag anything concerning",
|
||
'newTask.frequency': 'Frequency',
|
||
'newTask.everyNMinutes': 'Every N minutes',
|
||
'newTask.everyNHours': 'Every N hours',
|
||
'newTask.daily': 'Daily',
|
||
'newTask.weekdays': 'Weekdays (Mon–Fri)',
|
||
'newTask.specificDays': 'Specific days of week',
|
||
'newTask.monthly': 'Monthly',
|
||
'newTask.customCron': 'Custom cron expression',
|
||
'newTask.intervalMinutes': 'Every {n} minutes',
|
||
'newTask.intervalHours': 'Every {n} hours',
|
||
'newTask.atMinute': 'at minute :{m}',
|
||
'newTask.onMonthDay': 'On day {d} of each month',
|
||
'newTask.cronFormatHint': 'Format: minute hour day-of-month month day-of-week',
|
||
'newTask.invalidCron': 'Invalid cron expression',
|
||
'newTask.daySun': 'Sun',
|
||
'newTask.dayMon': 'Mon',
|
||
'newTask.dayTue': 'Tue',
|
||
'newTask.dayWed': 'Wed',
|
||
'newTask.dayThu': 'Thu',
|
||
'newTask.dayFri': 'Fri',
|
||
'newTask.daySat': 'Sat',
|
||
'newTask.delayNote': 'Scheduled tasks use a randomized delay of several minutes for server performance.',
|
||
'newTask.create': 'Create task',
|
||
'newTask.promptPlaceholder': 'Look at the commits from the last 24 hours. Summarize what changed, call out any risky patterns or missing tests, and note anything worth following up on.',
|
||
'newTask.notification': 'Notification',
|
||
'newTask.notifyOnComplete': 'Push notification on completion',
|
||
'newTask.notifyChannels': 'Notification channels',
|
||
'newTask.notifyHint': 'Send a native desktop notification or IM message when the task finishes.',
|
||
'newTask.notifyDesktop': 'Desktop',
|
||
'newTask.notConfigured': 'Not configured',
|
||
'newTask.noChannelConfigured': 'No IM channels configured yet. Go to Settings → IM Adapters to set up.',
|
||
'newTask.noChannelSelected': 'Select at least one notification channel.',
|
||
|
||
// ─── Cron Descriptions ──────────────────────────────────────
|
||
'cron.everyMinute': 'Runs every minute',
|
||
'cron.everyNMinutes': 'Runs every {n} minutes',
|
||
'cron.everyHour': 'Runs every hour',
|
||
'cron.everyNHours': 'Runs every {n} hours',
|
||
'cron.everyNHoursAtMinute': 'Runs every {n} hours at :{m}',
|
||
'cron.dailyAt': 'Runs daily at {time}',
|
||
'cron.weekdaysAt': 'Runs on weekdays at {time}',
|
||
'cron.specificDaysAt': 'Runs every {days} at {time}',
|
||
'cron.monthlyAt': 'Runs on the {day}th of every month at {time}',
|
||
'cron.customSchedule': 'Custom: {cron}',
|
||
'cron.dow.0': 'Sun',
|
||
'cron.dow.1': 'Mon',
|
||
'cron.dow.2': 'Tue',
|
||
'cron.dow.3': 'Wed',
|
||
'cron.dow.4': 'Thu',
|
||
'cron.dow.5': 'Fri',
|
||
'cron.dow.6': 'Sat',
|
||
|
||
// ─── Task Actions & Logs ──────────────────────────────────────
|
||
'tasks.runNow': 'Run now',
|
||
'tasks.confirmRun': 'Execute this task immediately?',
|
||
'tasks.confirmDisable': 'Disable this scheduled task?',
|
||
'tasks.confirmEnable': 'Enable this scheduled task?',
|
||
'tasks.confirmDelete': 'Permanently delete this task and all its logs?',
|
||
'tasks.running': 'Running...',
|
||
'tasks.viewLogs': 'Logs',
|
||
'tasks.moreActions': 'More actions',
|
||
'tasks.logsTitle': 'Execution logs',
|
||
'tasks.noLogs': 'No execution logs yet',
|
||
'tasks.runStatus.running': 'Running',
|
||
'tasks.runStatus.completed': 'Completed',
|
||
'tasks.runStatus.failed': 'Failed',
|
||
'tasks.runStatus.timeout': 'Timeout',
|
||
'tasks.duration': '{s}s',
|
||
'tasks.viewOutput': 'Summary',
|
||
'tasks.hideOutput': 'Hide',
|
||
'tasks.close': 'Close',
|
||
'tasks.edit': 'Edit',
|
||
'tasks.editTitle': 'Edit scheduled task',
|
||
'tasks.saveChanges': 'Save changes',
|
||
'tasks.openSession': 'View conversation',
|
||
'tasks.createdAt': 'Created: ',
|
||
'tasks.lastRunAt': 'Last run: ',
|
||
'tasks.outputHintSession': 'Click "View conversation" to see the full output in session view.',
|
||
'tasks.noOutputText': 'No output available.',
|
||
|
||
// ─── Prompt Editor ──────────────────────────────────────
|
||
'promptEditor.worktree': 'worktree',
|
||
'promptEditor.bypassWarning': 'Bypass mode grants full system access',
|
||
'promptEditor.within': 'within',
|
||
'promptEditor.selectFolder': '— select a folder to limit scope',
|
||
|
||
// ─── Permission Mode Selector ──────────────────────────────────────
|
||
'permMode.executionPermissions': 'Execution Permissions',
|
||
'permMode.askPermissions': 'Ask permissions',
|
||
'permMode.askPermDesc': 'Confirm file edits and higher-risk commands when CLI asks',
|
||
'permMode.autoAccept': 'Auto accept edits',
|
||
'permMode.autoAcceptDesc': 'Claude writes to disk without asking',
|
||
'permMode.autoMode': 'Auto mode',
|
||
'permMode.autoModeDesc': 'Claude reviews tool calls and runs actions it considers safe',
|
||
'permMode.planMode': 'Plan mode',
|
||
'permMode.planModeDesc': 'Architecture & reasoning only, no files',
|
||
'permMode.bypass': 'Bypass permissions',
|
||
'permMode.bypassDesc': 'Full tool access for shell and file system',
|
||
'permMode.dontAsk': "Don't ask",
|
||
'permMode.enableBypassTitle': 'Enable bypass permissions?',
|
||
'permMode.enableBypassSubtitle': 'This grants full access to your system',
|
||
'permMode.enableBypassBody': 'Claude will have <strong>unrestricted</strong> access to execute shell commands and modify files within:',
|
||
'permMode.permReadWrite': 'Read, write, and delete any files',
|
||
'permMode.permShell': 'Execute arbitrary shell commands',
|
||
'permMode.permPackages': 'Install or remove packages',
|
||
'permMode.enableBypassBtn': 'Enable bypass',
|
||
'permMode.disabledDuringTurn': 'Cannot switch permissions while session is active',
|
||
'permMode.enableAutoTitle': 'Enable Auto mode?',
|
||
'permMode.enableAutoBody': 'Auto mode reduces permission prompts, but it does not guarantee safety.',
|
||
'permMode.enableAutoDetail': 'Claude checks tool calls for risky actions and prompt injection. It runs actions it considers safe and blocks actions it considers risky. Use it only in isolated environments.',
|
||
'permMode.enableAutoBtn': 'Enable Auto mode',
|
||
|
||
// Mode labels (compact, for chips)
|
||
'permMode.label.default': 'Ask permissions',
|
||
'permMode.label.acceptEdits': 'Auto accept',
|
||
'permMode.label.auto': 'Auto mode',
|
||
'permMode.label.plan': 'Plan mode',
|
||
'permMode.label.bypassPermissions': 'Bypass',
|
||
'permMode.label.dontAsk': "Don't ask",
|
||
|
||
// ─── Model Selector ──────────────────────────────────────
|
||
'model.selectModel': 'Select model',
|
||
'model.configureProvider': 'Configure model provider',
|
||
'model.configuration': 'Model Configuration',
|
||
'model.searchPlaceholder': 'Search models',
|
||
'model.clearSearch': 'Clear model search',
|
||
'model.noMatches': 'No matching models',
|
||
'model.effort': 'Effort',
|
||
|
||
// ─── Directory Picker ──────────────────────────────────────
|
||
'dirPicker.selectProject': 'Select a project...',
|
||
'dirPicker.directory': 'Directory',
|
||
'dirPicker.recent': 'Recent',
|
||
'dirPicker.noRecent': 'No recent projects',
|
||
'dirPicker.chooseFolder': 'Choose a different folder',
|
||
'dirPicker.chooseProjectFolder': 'Choose project folder',
|
||
'dirPicker.useThisFolder': 'Use this folder',
|
||
'dirPicker.noSubdirs': 'No subdirectories',
|
||
'dirPicker.searchProjects': 'Search projects…',
|
||
'dirPicker.noMatches': 'No matching projects',
|
||
|
||
// ─── File Search ──────────────────────────────────────
|
||
'fileSearch.searching': 'Searching...',
|
||
'fileSearch.noMatch': 'No files match',
|
||
'fileSearch.noFiles': 'No files in this directory',
|
||
'fileSearch.accessDenied': 'Cannot access this directory',
|
||
'fileSearch.loadFailed': 'Failed to load directory',
|
||
'fileSearch.navigate': 'navigate',
|
||
'fileSearch.attach': 'attach',
|
||
'fileSearch.select': 'select',
|
||
'fileSearch.open': 'open folder',
|
||
'fileSearch.close': 'close',
|
||
'fileSearch.directory': 'folder',
|
||
'fileSearch.currentDirectory': 'current folder',
|
||
'fileSearch.folderTag': 'folder',
|
||
'fileSearch.fileTag': 'file',
|
||
'fileSearch.openFolder': 'Open folder',
|
||
|
||
// ─── Teams ──────────────────────────────────────
|
||
'teams.backToLeader': '\u2190 Back to Leader',
|
||
'teams.viewing': 'Viewing:',
|
||
'teams.transcript': 'transcript',
|
||
'teams.noMessages': 'No messages yet',
|
||
'teams.members': 'members',
|
||
'teams.working': 'Working...',
|
||
'teams.thinking': 'Thinking...',
|
||
'teams.leader': 'team-lead',
|
||
'teams.memberPlaceholder': 'Message this teammate directly...',
|
||
'teams.memberSessionHint': 'Messages here go straight to this teammate while you watch its transcript update.',
|
||
'teams.archivedMemberSessionHint': 'This preserved execution shows the teammate’s original conversation and tool calls.',
|
||
'teams.archivedMemberReadOnly': 'This archived execution is read-only. Return to the leader to continue the work.',
|
||
'agentTeams.title': 'Agent Teams Workbench',
|
||
'agentTeams.sharedTaskList': 'Shared task list',
|
||
'agentTeams.experimental': 'Experimental',
|
||
'agentTeams.stats.phase': 'Phase',
|
||
'agentTeams.stats.completed': 'Done',
|
||
'agentTeams.stats.running': 'Running',
|
||
'agentTeams.stats.available': 'Available',
|
||
'agentTeams.stats.blocked': 'Blocked',
|
||
'agentTeams.live.following': 'Live · Following team',
|
||
'agentTeams.live.runningHint': 'Following {count} active teammates. Replay controls open after the team finishes.',
|
||
'agentTeams.live.formingHint': 'The lead is forming the team. Replay controls open after the team finishes.',
|
||
'agentTeams.live.waitingHint': 'Waiting for teammates to claim the next work. Replay controls open after the team finishes.',
|
||
'agentTeams.live.elapsed': 'Elapsed',
|
||
'agentTeams.live.sessionClock': 'Session clock',
|
||
'agentTeams.replay.play': 'Play',
|
||
'agentTeams.replay.pause': 'Pause',
|
||
'agentTeams.replay.replay': 'Replay',
|
||
'agentTeams.replay.speed': 'Replay speed',
|
||
'agentTeams.replay.timeline': 'Replay timeline · click to seek',
|
||
'agentTeams.canvas.formation': '1 · Formation — lead centered, teammates below',
|
||
'agentTeams.canvas.tasks': '2 · Shared task list — dependency layers, left → right',
|
||
'agentTeams.canvas.laneRoot': 'No dependencies · ready',
|
||
'agentTeams.canvas.laneDepth': 'Layer {layer}',
|
||
'agentTeams.canvas.laneWrapUp': 'Wrap-up',
|
||
'agentTeams.legend.unmet': 'Dependency unmet',
|
||
'agentTeams.legend.satisfied': 'Dependency satisfied (flowing downstream)',
|
||
'agentTeams.legend.tether': 'Teammate executing this task',
|
||
'agentTeams.legend.unlocked': 'Just unlocked',
|
||
'agentTeams.legend.flight': 'Message / claim in flight',
|
||
'agentTeams.member.inbox': 'Inbox {count}',
|
||
'agentTeams.member.executingTask': 'Executing #{task}',
|
||
'agentTeams.member.waitingForTask': 'Idle · waiting for work',
|
||
'agentTeams.member.waitingForDependency': 'Idle · waiting for #{task}',
|
||
'agentTeams.member.waitingForClose': 'Idle · waiting for shutdown',
|
||
'agentTeams.lead.forming': 'Forming team',
|
||
'agentTeams.lead.coordinating': 'Coordinating · awaiting reports',
|
||
'agentTeams.lead.finishing': 'Wrapping up results',
|
||
'agentTeams.lead.archived': 'Run archived',
|
||
'agentTeams.task.start': 'Start',
|
||
'agentTeams.task.unlocked': 'Just unlocked',
|
||
'agentTeams.task.reconstructedOwner': 'Reconstructed owner',
|
||
'agentTeams.communication.open': 'Open communication panel',
|
||
'agentTeams.communication.close': 'Close communication panel',
|
||
'agentTeams.communication.backToFeed': 'Back to communication',
|
||
'agentTeams.inspector.independentContext': '{role} · independent context',
|
||
'agentTeams.inspector.current': 'Current',
|
||
'agentTeams.inspector.completedTasks': 'Completed',
|
||
'agentTeams.inspector.messages': 'Messages',
|
||
'agentTeams.inspector.taskHistory': 'Task history',
|
||
'agentTeams.inspector.taskHistoryHint': 'One teammate executes multiple tasks in sequence',
|
||
'agentTeams.inspector.sent': 'Sent',
|
||
'agentTeams.inspector.received': 'Received',
|
||
'agentTeams.inspector.failureReason': 'Reason',
|
||
'agentTeams.model.label': 'Model',
|
||
'agentTeams.model.inheritFromLead': 'Inherit from lead · {model}',
|
||
'agentTeams.model.unknown': 'Unknown',
|
||
'agentTeams.hideReport': 'Hide Agent Teams run report',
|
||
'agentTeams.closeReport': 'Close Agent Teams run report',
|
||
'agentTeams.loading': 'Waiting for Agent Teams activity…',
|
||
'agentTeams.phase.forming': 'Forming team',
|
||
'agentTeams.phase.running': 'Parallel execution',
|
||
'agentTeams.phase.finishing': 'Wrapping up',
|
||
'agentTeams.phase.completed': 'Completed',
|
||
'agentTeams.progressLabel': 'Team task progress',
|
||
'agentTeams.followingLive': 'Following live',
|
||
'agentTeams.reviewHistory': 'Review history',
|
||
'agentTeams.older': 'Older workbench state',
|
||
'agentTeams.newer': 'Newer workbench state',
|
||
'agentTeams.backToLive': 'Back to live',
|
||
'agentTeams.live': 'LIVE',
|
||
'agentTeams.leader': 'Lead',
|
||
'agentTeams.restArea': 'REST AREA',
|
||
'agentTeams.emptyTasks': 'The team is forming. The dependency graph appears after tasks are created.',
|
||
'agentTeams.resizePanel': 'Resize Agent Teams workbench',
|
||
'agentTeams.task.blocked': 'Blocked',
|
||
'agentTeams.task.open': 'Available',
|
||
'agentTeams.task.running': 'In progress',
|
||
'agentTeams.task.completed': 'Completed',
|
||
'agentTeams.task.closeDetail': 'Close task details',
|
||
'agentTeams.task.ownerLabel': 'Owner',
|
||
'agentTeams.task.dependsOn': 'Depends on',
|
||
'agentTeams.task.unblocks': 'Unblocks',
|
||
'agentTeams.openTask': 'View task: {subject}',
|
||
'agentTeams.task.inferredOwner': '{name} (inferred)',
|
||
'agentTeams.task.layer': 'Layer {layer}',
|
||
'agentTeams.task.dependencies': 'Depends on {dependencies}',
|
||
'agentTeams.task.unclaimed': 'Waiting for a teammate',
|
||
'agentTeams.task.completedNoOwner': 'Completed · owner not recorded',
|
||
'agentTeams.member.working': 'Working',
|
||
'agentTeams.member.idle': 'Idle',
|
||
'agentTeams.member.stopped': 'Stopped',
|
||
'agentTeams.member.exited': 'Exited',
|
||
'agentTeams.member.error': 'Error',
|
||
'agentTeams.member.retrying': 'Auto-retry {attempt}/{max}',
|
||
'agentTeams.member.retryInSeconds': 'Retrying automatically in {n}s',
|
||
'agentTeams.member.retryInMinutes': 'Retrying automatically in about {n} min',
|
||
'agentTeams.member.retryNow': 'Retrying automatically now',
|
||
'agentTeams.member.stoppedHint': 'Send a message to resume it from its saved conversation',
|
||
'agentTeams.member.errorHint': 'Once the problem is fixed, send a message to let it continue',
|
||
'agentTeams.member.stalledOnTask': '{state} · at #{task}',
|
||
'agentTeams.inspector.groupRunning': 'Now',
|
||
'agentTeams.inspector.groupUpcoming': 'Up next',
|
||
'agentTeams.inspector.groupCompleted': 'Done',
|
||
'agentTeams.openMember': 'Open {name} details',
|
||
'agentTeams.resizeCommunication': 'Resize communication panel',
|
||
'agentTeams.memberTranscriptLoading': 'Loading member transcript...',
|
||
'agentTeams.communication.title': 'Communication',
|
||
'agentTeams.communication.count': '{count} messages',
|
||
'agentTeams.communication.all': 'All',
|
||
'agentTeams.communication.timeline': 'Task timeline',
|
||
'agentTeams.communication.timeAll': 'Full run',
|
||
'agentTeams.communication.timeEarly': 'Start',
|
||
'agentTeams.communication.timeMiddle': 'Progress',
|
||
'agentTeams.communication.timeLate': 'Wrap-up',
|
||
'agentTeams.communication.empty': 'No messages in this view yet. Approved tasks are delivered directly to members. Open a member’s execution to see their progress.',
|
||
'agentTeams.communication.direct': 'DIRECT',
|
||
'agentTeams.communication.broadcast': 'BROADCAST',
|
||
'agentTeams.communication.system': 'SYSTEM',
|
||
'agentTeams.communication.everyone': 'everyone',
|
||
'agentTeams.communication.taskAssignment': 'Assigned {task} {subject} to {name}',
|
||
'agentTeams.communication.taskClaimed': '{name} claimed {task} {subject}',
|
||
'agentTeams.communication.assignment': 'Assignments',
|
||
'agentTeams.communication.peer': 'Direct',
|
||
'agentTeams.communication.report': 'Reports',
|
||
'agentTeams.communication.shutdownRequest': 'Shutdown requested: {reason}',
|
||
'agentTeams.communication.shutdownResponse': 'Shutdown response received',
|
||
'agentTeams.communication.idle': 'Teammate is now idle',
|
||
'agentTeams.disbanded': 'Team disbanded; results merged into the main conversation',
|
||
'agentTeams.memberDetails': '{name} details',
|
||
'agentTeams.memberTasks': 'OWNED TASKS',
|
||
'agentTeams.noMemberTasks': 'No tasks assigned yet.',
|
||
'agentTeams.memberMessages': 'RELATED MESSAGES',
|
||
'agentTeams.noMemberMessages': 'No related team messages yet. Approved tasks are delivered directly; use the execution button below to see this member’s progress.',
|
||
'agentTeams.fullConversationHint': 'The full conversation, tool calls, and streaming output reuse the existing session view.',
|
||
'agentTeams.archivedConversationHint': 'Open the preserved execution session to review the full conversation and tool calls.',
|
||
'agentTeams.openConversation': 'Talk directly to {name}',
|
||
'agentTeams.openExecution': 'View {name} execution',
|
||
'agentTeams.dependencyLegend': 'Solid: primary dependency · dashed: secondary · hover to focus',
|
||
'agentTeams.backToSession': 'Back to session',
|
||
'agentTeams.backToOverview': 'Back to team overview',
|
||
'agentTeams.openInTab': 'Open in tab',
|
||
'agentTeams.communication.lifecycle.idle_notification': 'Went idle, waiting for work',
|
||
'agentTeams.communication.lifecycle.shutdown_request': 'Asked to wrap up',
|
||
'agentTeams.communication.lifecycle.shutdown_approved': 'Wrap-up approved',
|
||
'agentTeams.communication.lifecycle.shutdown_rejected': 'Wrap-up declined',
|
||
'agentTeams.communication.lifecycle.teammate_terminated': 'Teammate stopped',
|
||
'agentTeams.communication.lifecycle.shutdown_response': 'Acknowledged the exit',
|
||
'agentTeams.communication.showLifecycle': 'Show {count} status signals',
|
||
'agentTeams.communication.hideLifecycle': 'Hide status signals',
|
||
'agentTeams.communication.expand': 'Show more',
|
||
'agentTeams.communication.collapse': 'Show less',
|
||
'agentTeams.inline.created': 'Agent team · {count} teammates',
|
||
'agentTeams.inline.coordination': 'Team coordination · {count} steps',
|
||
'agentTeams.inline.open': 'Open run report',
|
||
'agentTeams.report.title': 'Agent Teams run report',
|
||
'agentTeams.report.openWorkbench': 'Workbench',
|
||
'agentTeams.report.tasksDone': 'tasks done',
|
||
'agentTeams.report.members': 'Members {count}',
|
||
'agentTeams.report.tasks': 'Tasks {count}',
|
||
'agentTeams.report.ownedTasks': '{count} owned',
|
||
'agentTeams.report.messages': '{count} messages',
|
||
'agentTeams.report.disbanded': 'Team disbanded, results merged into the main session',
|
||
'agentTeams.report.memberStatus.running': 'Working',
|
||
'agentTeams.report.memberStatus.idle': 'Standing by',
|
||
'agentTeams.report.memberStatus.completed': 'Done',
|
||
'agentTeams.report.memberStatus.error': 'Errored',
|
||
'agentTeams.inline.tasks': '{completed}/{total} tasks',
|
||
'agentTeams.strip.label': 'Team',
|
||
|
||
// ─── Session Activity ──────────────────────────────────────
|
||
'session.activity.title': 'Activity',
|
||
'session.activity.close': 'Close activity',
|
||
'session.activity.clearFinished': 'Clear finished',
|
||
'session.activity.openTeamMember': 'Open team member {name}',
|
||
'session.activity.openRun': 'Open run {name}',
|
||
'session.activity.openBackgroundTask': 'Open background task {name}',
|
||
'session.activity.stopBackgroundTask': 'Stop background task {name}',
|
||
'session.activity.stoppingBackgroundTask': 'Stopping background task {name}',
|
||
'session.activity.details.title': 'Details',
|
||
'session.activity.details.type': 'Type',
|
||
'session.activity.details.description': 'Description',
|
||
'session.activity.details.summary': 'Summary',
|
||
'session.activity.details.outputFile': 'Output file',
|
||
'session.activity.details.usage': 'Usage',
|
||
'session.activity.section.tasks': 'Tasks',
|
||
'session.activity.tasksProgress': 'Task progress {completed}/{total}',
|
||
'session.activity.section.team': 'Team',
|
||
'session.activity.section.workflow': 'Workflow',
|
||
'session.activity.section.backgroundTasks': 'Background Tasks',
|
||
'session.activity.section.subagents': 'SubAgents',
|
||
'session.activity.section.sources': 'Sources',
|
||
'session.activity.empty.tasks': 'No tasks',
|
||
'session.activity.empty.team': 'No team members',
|
||
'session.activity.empty.backgroundTasks': 'No background tasks',
|
||
'session.activity.empty.subagents': 'No SubAgents',
|
||
'session.activity.empty.sources': 'No sources',
|
||
'session.activity.task.completed': 'Task completed',
|
||
'session.activity.task.inProgress': 'Task in progress',
|
||
'session.activity.task.pending': 'Task pending',
|
||
'session.activity.tasks.earlier': 'Earlier tasks',
|
||
'session.activity.tasks.earlierSummary': 'Earlier turns: {completed}/{total} completed',
|
||
'session.activity.status.pending': 'Pending',
|
||
'session.activity.status.inProgress': 'In progress',
|
||
'session.activity.status.completed': 'Completed',
|
||
'session.activity.status.running': 'Running',
|
||
'session.activity.status.stopping': 'Stopping',
|
||
'session.activity.status.failed': 'Failed',
|
||
'session.activity.status.stopped': 'Stopped',
|
||
'session.activity.status.idle': 'Idle',
|
||
'session.activity.status.error': 'Error',
|
||
'session.activity.status.unknown': 'Unknown',
|
||
|
||
// ─── SubAgent Run ──────────────────────────────────────
|
||
'subagentRun.incompleteHistory': 'Some history could not be read. Available content is shown; refresh to retry.',
|
||
'subagentRun.refresh': 'Refresh SubAgent run',
|
||
'subagentRun.backToParent': 'Back to parent session',
|
||
'subagentRun.loading': 'Loading SubAgent run...',
|
||
'subagentRun.source': 'Source',
|
||
'subagentRun.agent': 'Agent',
|
||
'subagentRun.model': 'Model',
|
||
'subagentRun.unknown': 'Unknown',
|
||
'subagentRun.task': 'Task',
|
||
'subagentRun.updated': 'Updated',
|
||
'subagentRun.output': 'Output',
|
||
'subagentRun.agentInvocation': 'Agent invocation',
|
||
'subagentRun.parentToolInput': 'Parent Agent tool input',
|
||
'subagentRun.parentToolCall': 'Parent Agent Tool Call',
|
||
'subagentRun.transcript': 'Transcript',
|
||
'subagentRun.noTranscript': 'No local transcript messages captured for this SubAgent.',
|
||
'subagentRun.truncated': 'Showing first 50 and latest 950 entries',
|
||
'subagentRun.source.transcript': 'Transcript',
|
||
'subagentRun.source.sessionHistory': 'Session history',
|
||
'subagentRun.source.liveTask': 'Live task',
|
||
'subagentRun.source.none': 'None',
|
||
'subagentRun.status.completed': 'Completed',
|
||
'subagentRun.status.failed': 'Failed',
|
||
'subagentRun.status.stopped': 'Stopped',
|
||
'subagentRun.status.running': 'Running',
|
||
'subagentRun.status.unknown': 'Unknown',
|
||
'subagentRun.result.completedFallback': 'SubAgent completed without a result payload.',
|
||
'subagentRun.result.failedFallback': 'SubAgent failed without an error payload.',
|
||
'subagentRun.result.stoppedFallback': 'SubAgent stopped without a result payload.',
|
||
'subagentRun.result.noneFallback': 'No result available.',
|
||
'subagentRun.readOnly': 'This is the record of a one-shot subagent. It cannot be continued.',
|
||
|
||
// ─── Scheduled Tasks Pages ──────────────────────────────────────
|
||
'scheduledPage.title': 'Scheduled tasks',
|
||
'scheduledPage.subtitle': 'Run tasks on a schedule or whenever you need them. Type {code} in any existing session to create one.',
|
||
'scheduledPage.desktopNotice': 'Scheduled tasks only run while the desktop app is open. Make sure it stays running for tasks to fire on time.',
|
||
'scheduledPage.oldSubtitle': 'Manage automated operational routines and background maintenance.',
|
||
'scheduledPage.executionMode': 'Execution Mode',
|
||
'scheduledPage.localMode': 'Local Mode',
|
||
'scheduledPage.remoteMode': 'Remote Mode',
|
||
'scheduledPage.nextRun': 'Next Run',
|
||
'scheduledPage.systemHealth': 'System Health',
|
||
'scheduledPage.activeSession': 'Active Session',
|
||
'scheduledPage.endOfList': 'End of scheduled list',
|
||
'scheduledPage.pausedTasks': '9 other tasks are currently paused or disabled for maintenance.',
|
||
'scheduledPage.recentLogs': 'Recent Output Logs',
|
||
'scheduledPage.viewArtifacts': 'View Full Artifacts',
|
||
'scheduledPage.resourceAllocation': 'Resource Allocation',
|
||
'scheduledPage.cpuCapacity': 'CPU Capacity',
|
||
'scheduledPage.memoryLoad': 'Memory Load',
|
||
'scheduledPage.connectedLocal': 'Connected to local node',
|
||
'scheduledPage.thisMonth': '{count} this month',
|
||
|
||
// ─── Update Checker ──────────────────────────────────────
|
||
'update.available': 'v{version} available',
|
||
'update.availableLabel': 'Available',
|
||
'update.checking': 'Checking for updates...',
|
||
'update.checkNow': 'Check now',
|
||
'update.checkedAt': 'Last checked {time}',
|
||
'update.currentVersionUnknown': 'Unknown',
|
||
'update.newVersion': 'New version v{version} available',
|
||
'update.downloading': 'Downloading...',
|
||
'update.downloaded': 'Update downloaded. Restart when you are ready to use it.',
|
||
'update.idle': 'Check for updates to compare your installed version with the latest GitHub Release.',
|
||
'update.installAndRestart': 'Install and restart',
|
||
'update.installing': 'Installing update...',
|
||
'update.now': 'Update now',
|
||
'update.later': 'Later',
|
||
'update.progress': 'Downloading update... {progress}%',
|
||
'update.progressBytes': 'Downloading update... {downloaded} downloaded',
|
||
'update.proxyAdvanced': 'Advanced update proxy',
|
||
'update.proxyModeManual': 'Manual proxy',
|
||
'update.proxyModeManualDescription': 'Use a local HTTP proxy address you provide.',
|
||
'update.proxyModeSystem': 'System proxy',
|
||
'update.proxyModeSystemDescription': 'Use the OS HTTP/HTTPS proxy automatically.',
|
||
'update.proxySave': 'Save',
|
||
'update.proxyScopeHint': 'This only affects app update checks and downloads.',
|
||
'update.proxyUrl': 'Proxy URL',
|
||
'update.proxyUrlHint': 'HTTP and HTTPS proxy URLs are supported, for example http://127.0.0.1:7890.',
|
||
'update.proxyUrlInvalid': 'Enter an HTTP or HTTPS proxy URL.',
|
||
'update.proxyUrlRequired': 'Enter a proxy URL.',
|
||
'update.releaseNotes': 'Release Notes',
|
||
'update.readyBody': 'v{version} has been downloaded. Restart when you are ready to use it.',
|
||
'update.readyTitle': 'Update ready',
|
||
'update.restarting': 'Restarting to finish update...',
|
||
'update.upToDate': 'You are up to date on v{version}.',
|
||
'update.failed': 'Update failed: {error}',
|
||
|
||
// ─── Active Session ──────────────────────────────────────
|
||
'session.untitled': 'Untitled Session',
|
||
'session.active': 'session active',
|
||
'session.lastUpdated': 'last updated {time}',
|
||
'session.messages': '{count} messages',
|
||
'session.apiTokens': '{count} API tokens',
|
||
'session.apiTokensWithCache': '{count} tokens incl. cache',
|
||
'session.apiTokenBreakdown': 'API usage: {total} tokens · input {input} · output {output} · cache read {cacheRead} · cache write {cacheWrite}',
|
||
'session.historyLoadFailed': 'Failed to load session history.',
|
||
'session.historyTooLarge': 'This session history is too large to load here.',
|
||
'session.workspaceUnavailable': 'Workspace unavailable: {dir}',
|
||
'session.worktreeRemoved': 'The temporary workspace was cleaned up. History is still available; start a new session in {dir} to continue.',
|
||
'session.timeJustNow': 'just now',
|
||
'session.timeMinutes': '{n}m ago',
|
||
'session.timeHours': '{n}h ago',
|
||
'session.timeDays': '{n}d ago',
|
||
'trace.noResponse': 'No response body captured',
|
||
'trace.requestBody': 'Request body',
|
||
'trace.requestHeaders': 'Request headers',
|
||
'trace.responseBody': 'Response body',
|
||
'trace.responseHeaders': 'Response headers',
|
||
'trace.toolResult': 'Tool result',
|
||
'trace.truncatedShort': 'truncated',
|
||
'trace.noData': 'No data',
|
||
'trace.toolError': 'Tool error',
|
||
'trace.section.response': 'Response',
|
||
'trace.section.messages': 'Messages',
|
||
'trace.section.systemPrompt': 'System prompt',
|
||
'trace.section.context': 'Injected context',
|
||
'trace.context.systemReminder': 'System reminder',
|
||
'trace.context.deferredTools': 'Deferred tools',
|
||
'trace.context.other': 'Injected',
|
||
'trace.section.tools': 'Tools',
|
||
'trace.section.parameters': 'Parameters',
|
||
'trace.section.raw': 'Raw',
|
||
'trace.detail.stopReason': 'Stop reason',
|
||
'trace.detail.streaming': 'Waiting for the model response...',
|
||
'trace.detail.aborted': 'The request was aborted before the response completed (timeout or cancellation).',
|
||
'trace.status.aborted': 'Aborted',
|
||
'trace.detail.legacyTruncated': 'Legacy truncated record; the semantic view is unavailable. See Raw below.',
|
||
'trace.detail.fetchFailed': 'Failed to load the full record; showing the truncated preview.',
|
||
'trace.detail.earlierMessages': 'Show {count} earlier messages',
|
||
'trace.detail.chars': '{count} chars',
|
||
'trace.detail.thinking': 'thinking',
|
||
|
||
// ─── App Shell ──────────────────────────────────────
|
||
'app.serverFailed': 'Local server failed to start',
|
||
'app.serverFailedHint': 'Please include a screenshot of this diagnostic panel when reporting the issue.',
|
||
'app.startupError': 'Startup error',
|
||
'app.serverLogs': 'Server logs',
|
||
'app.copyDiagnostics': 'Copy diagnostics',
|
||
'app.copiedDiagnostics': 'Copied',
|
||
'app.launching': 'Launching local workspace...',
|
||
|
||
// ─── Error Codes ──────────────────────────────────────
|
||
'error.CLI_NOT_RUNNING': 'CLI process is not running. The session may have ended or the process crashed.',
|
||
'error.CLI_START_FAILED': 'Failed to start CLI process.',
|
||
'error.CLI_AUTH_REQUIRED': 'Authentication is required. Please log in.',
|
||
'error.CLI_SESSION_CONFLICT': 'Session is already in use by another process.',
|
||
'error.CLI_SPAWN_FAILED': 'Failed to spawn CLI subprocess.',
|
||
'error.CLI_ERROR': 'An error occurred during processing.',
|
||
'error.WORKDIR_INVALID': 'Working directory is invalid or does not exist.',
|
||
'error.PARSE_ERROR': 'Invalid message format.',
|
||
'error.UNKNOWN_TYPE': 'Unknown message type.',
|
||
'error.BAD_REQUEST': 'Bad request.',
|
||
'error.NOT_FOUND': 'Resource not found.',
|
||
'error.INTERNAL_ERROR': 'Internal server error.',
|
||
|
||
// ─── Business Errors ──────────────────────────────────────
|
||
'businessError.pdf_too_large': 'The PDF is too large for the selected model. Convert it to text or use a smaller PDF.',
|
||
'businessError.pdf_password_protected': 'The PDF is password protected. Unlock or convert it before sending it again.',
|
||
'businessError.pdf_invalid': 'The PDF file is not valid. Convert it to text or send a different file.',
|
||
'businessError.image_too_large': 'The image is too large for the selected model. Resize it or send a smaller image.',
|
||
'businessError.image_unsupported': 'This model does not support images. Continue with text, or switch to a vision-capable model and send the image again.',
|
||
'businessError.request_too_large': 'The request is too large for your provider or relay. Earlier images and documents are removed automatically on your next message; if it still fails, compact the conversation or start a new session.',
|
||
'businessError.prompt_too_long': 'The prompt is too long for the selected model. Compact the conversation or retry with less context.',
|
||
'businessError.auto_mode_unavailable': 'Auto mode is unavailable for your current plan.',
|
||
|
||
// ─── Server Status Verbs ──────────────────────────────────────
|
||
'serverVerb.Thinking': 'Thinking',
|
||
'serverVerb.Compacting conversation': 'Compacting context',
|
||
'serverVerb.Running': 'Running',
|
||
'serverVerb.Working': 'Working',
|
||
'serverVerb.Creating worktree': 'Creating worktree',
|
||
'serverVerb.Task started': 'Task started',
|
||
'serverVerb.Task in progress': 'Task in progress',
|
||
'chat.retry.title': 'Request failed, retrying',
|
||
'chat.retry.attempt': 'retry {attempt}/{max}',
|
||
'chat.retry.httpStatus': 'HTTP {status}',
|
||
'chat.retry.rateLimit': 'usage or rate limit reached',
|
||
'chat.retry.networkError': 'network error',
|
||
'chat.retry.waiting': 'waiting {seconds}s',
|
||
'chat.retry.waitingLong': 'retrying in about {duration}',
|
||
'chat.retry.retrying': 'retrying now…',
|
||
'chat.fallback.title': 'Network hiccup — switched to non-streaming mode',
|
||
'chat.fallback.detail': 'response arrives in one piece, this can take a while',
|
||
|
||
|
||
// ─── Tabs ──────────────────────────────────────
|
||
'tabs.close': 'Close',
|
||
'tabs.closeOthers': 'Close Others',
|
||
'tabs.closeLeft': 'Close to the Left',
|
||
'tabs.closeRight': 'Close to the Right',
|
||
'tabs.closeAll': 'Close All',
|
||
'tabs.closeConfirmTitle': 'Session Running',
|
||
'tabs.closeConfirmMessage': 'This session is still running. What would you like to do?',
|
||
'tabs.closeConfirmKeep': 'Keep Running',
|
||
// ─── Slash Command Descriptions ──────────────────────────────────────
|
||
'slashCmd.agent.description': 'Run a prompt with a selected Agent',
|
||
'slashCmd.mcp.description': 'Open available MCP tools for the current chat context',
|
||
'slashCmd.skills.description': 'Browse user-invocable skills for the current chat context',
|
||
'slashCmd.saveWorkflow.description': 'Save a completed Workflow for reuse',
|
||
'slashCmd.help.description': 'Show available desktop and agent commands',
|
||
'slashCmd.status.description': 'Show session status, usage, and context',
|
||
'slashCmd.cost.description': 'Show session usage and costs',
|
||
'slashCmd.context.description': 'Show current context usage',
|
||
'slashCmd.plugin.description': 'Open desktop plugin controls in Settings',
|
||
'slashCmd.memory.description': 'Open project memory files in Settings',
|
||
'slashCmd.doctor.description': 'Open Doctor in Diagnostics',
|
||
'slashCmd.compact.description': 'Compact conversation context',
|
||
'slashCmd.clear.description': 'Clear conversation history',
|
||
'slashCmd.goal.description': 'Set a completion goal',
|
||
'slashCmd.review.description': 'Review code changes',
|
||
'slashCmd.commit.description': 'Create a git commit',
|
||
'slashCmd.pr.description': 'Create a pull request',
|
||
'slashCmd.init.description': 'Initialize project CLAUDE.md',
|
||
'slashCmd.bug.description': 'Report a bug',
|
||
'slashCmd.config.description': 'Open configuration',
|
||
'slashCmd.login.description': 'Switch Anthropic accounts',
|
||
'slashCmd.logout.description': 'Sign out of current account',
|
||
'slashCmd.model.description': 'Switch AI model',
|
||
'slashCmd.permissions.description': 'View or manage tool permissions',
|
||
'slashCmd.terminal-setup.description': 'Set up terminal integration',
|
||
'slashCmd.vim.description': 'Toggle vim editing mode',
|
||
|
||
'tabs.closeConfirmStop': 'Stop & Close',
|
||
'tabs.closeAllConfirmTitle': 'Sessions Running',
|
||
'tabs.closeAllConfirmMessage': '{count} sessions are still running. Stop them before closing these tabs?',
|
||
'tabs.closeAllConfirmStop': 'Stop All & Close',
|
||
'tabs.sessionRunning': 'Session running',
|
||
'tabs.openTerminal': 'Open Terminal',
|
||
'tabs.showWorkspace': 'Show Workspace',
|
||
'tabs.hideWorkspace': 'Hide Workspace',
|
||
'tabs.showBrowser': 'Show Browser',
|
||
'tabs.hideBrowser': 'Hide Browser',
|
||
'tabs.scrollLeft': 'Scroll tabs left',
|
||
'tabs.scrollRight': 'Scroll tabs right',
|
||
'tabs.jumpToAttention': 'Jump to the next waiting session ({count} waiting)',
|
||
'tabs.closeTab': 'Close {title}',
|
||
'tabs.untitled': 'Untitled',
|
||
|
||
// Skills Market
|
||
'sidebar.market': 'Skills Market',
|
||
'market.title': 'Skills Market',
|
||
'market.subtitle': 'Curated skills from ClawHub and SkillHub, with a live search across both markets when you need more.',
|
||
'market.searchPlaceholder': 'Search skills by name, keyword…',
|
||
'market.clearSearch': 'Clear search',
|
||
'market.resultCount': '{count} skills',
|
||
'market.loadMore': 'Load more',
|
||
'market.loadingMore': 'Loading more…',
|
||
'market.loadMoreError': 'Failed to load more skills',
|
||
'market.installedSkills': 'Installed skills',
|
||
'market.installedSkillsHint': 'View the skills installed on this machine',
|
||
'market.loading': 'Loading skills…',
|
||
'market.empty': 'No skills available',
|
||
'market.emptyHint': 'The curated catalog returned nothing. Try again in a moment.',
|
||
'market.emptySearch': 'No skills match your search',
|
||
'market.emptySearchHint': 'Try different keywords or clear the filters.',
|
||
'market.error.list': 'Failed to load the skills market',
|
||
'market.retry': 'Retry',
|
||
'market.filter.source': 'Source',
|
||
'market.filter.security': 'Security',
|
||
'market.filter.installed': 'Install status',
|
||
'market.source.all': 'All sources',
|
||
'market.source.clawhub': 'ClawHub',
|
||
'market.source.skillhub': 'SkillHub',
|
||
'market.security.all': 'All security states',
|
||
'market.security.verified': 'Verified',
|
||
'market.security.benign': 'Scanned safe',
|
||
'market.security.unknown': 'Not audited',
|
||
'market.security.flagged': 'Flagged',
|
||
'market.securityHint.verified': 'Published by a verified author and passed the source’s security scan.',
|
||
'market.securityHint.benign': 'The source’s security scan found no risks.',
|
||
'market.securityHint.unknown': 'No security audit data from the source — review the files before installing.',
|
||
'market.securityHint.flagged': 'The source’s security scan flagged potential risks.',
|
||
'market.disclaimer.title': 'Use third-party skills with care.',
|
||
'market.disclaimer.body': 'Skills come from community sources and are not audited by this app. Review the files before installing — ideally have AI scan them for safety first.',
|
||
'market.disclaimer.dismiss': 'Dismiss disclaimer',
|
||
'market.installedFilter.all': 'All skills',
|
||
'market.installedFilter.installed': 'Installed',
|
||
'market.installedFilter.installable': 'Not installed',
|
||
'market.sourceStatus.ok': 'Online',
|
||
'market.sourceStatus.degraded': 'Degraded',
|
||
'market.sourceStatus.failed': 'Unavailable',
|
||
'market.sourceStatus.cached': 'Cached',
|
||
'market.sourceStatus.cachedAt': 'Cached {time}',
|
||
'market.card.by': 'by {author}',
|
||
'market.card.moreTags': '+{count}',
|
||
'market.install.state.installed': 'Installed',
|
||
'market.install.state.installable': 'Installable',
|
||
'market.install.state.notInstallable': 'Not installable',
|
||
'market.install.action': 'Install',
|
||
'market.install.installing': 'Installing…',
|
||
'market.uninstall.action': 'Uninstall',
|
||
'market.uninstall.uninstalling': 'Uninstalling…',
|
||
'market.uninstall.confirmTitle': 'Uninstall skill',
|
||
'market.uninstall.confirmMessage': 'Remove "{name}" from your local skills? The files under {path} will be deleted.',
|
||
'market.uninstall.success': '"{name}" was uninstalled.',
|
||
'market.reason.empty-file-list': 'This skill has no installable files (missing SKILL.md).',
|
||
'market.reason.file-too-large': 'This skill contains files that exceed the size limit.',
|
||
'market.reason.too-many-files': 'This skill contains too many files to install safely.',
|
||
'market.reason.invalid-name': 'The skill name cannot be used as a local directory name.',
|
||
'market.reason.name-conflict': 'A local skill with the same name already exists. Rename or remove it first.',
|
||
'market.reason.source-unavailable': 'The source of this skill is currently unavailable.',
|
||
'market.detail.back': 'Back to market',
|
||
'market.detail.overview': 'Overview',
|
||
'market.detail.files': 'Files',
|
||
'market.detail.author': 'Author',
|
||
'market.detail.version': 'Version',
|
||
'market.detail.updated': 'Updated',
|
||
'market.detail.category': 'Category',
|
||
'market.detail.license': 'License',
|
||
'market.detail.downloads': 'Downloads',
|
||
'market.detail.installs': 'Installs',
|
||
'market.detail.stars': 'Stars',
|
||
'market.detail.securityReport': 'Security reports',
|
||
'market.detail.viewReport': 'View report',
|
||
'market.detail.mirror': 'Also listed on {source}',
|
||
'market.detail.requiresApiKey': 'Requires API key',
|
||
'market.detail.loadError': 'Failed to load skill details',
|
||
'market.detail.noDescription': 'This skill provides no description.',
|
||
'market.detail.metadata': 'Metadata',
|
||
'market.detail.metadataCollapse': 'Collapse',
|
||
'market.detail.metadataExpand': 'Expand',
|
||
'market.file.empty': 'Select a file on the left to preview it.',
|
||
'market.file.truncated': 'Preview truncated — the file is larger than the preview limit.',
|
||
'market.file.loadError': 'Failed to load this file',
|
||
'market.file.noFiles': 'No files available for this skill.',
|
||
'market.installConfirm.title': 'Install skill',
|
||
'market.installConfirm.message': 'Install "{name}" from {source}?',
|
||
'market.installConfirm.location': 'Install location',
|
||
'market.installConfirm.effectNote': 'The skill becomes available in new sessions after installation.',
|
||
'market.installConfirm.riskBenign': 'Security scans found no risks in this skill.',
|
||
'market.installConfirm.riskVerified': 'This skill is from a verified publisher and passed security scans.',
|
||
'market.installConfirm.riskUnknown': 'This skill has not been security-audited. Review its files before installing.',
|
||
'market.installConfirm.riskFlagged': 'Security scans flagged this skill as potentially risky. Install only if you trust it.',
|
||
'market.installConfirm.confirm': 'Install',
|
||
'market.installConfirm.cancel': 'Cancel',
|
||
'market.installSuccess': '"{name}" installed. It becomes available in new sessions.',
|
||
'market.installError.network': 'Install failed: could not reach the skill source. Check your network and retry.',
|
||
'market.installError.checksum': 'Install aborted: a downloaded file failed integrity verification. Do not retry until the source is trustworthy.',
|
||
'market.installError.exists': 'Install failed: this skill is already installed or being installed.',
|
||
'market.installError.disk': 'Install failed: could not write to disk. Check permissions and free space.',
|
||
'market.installError.notInstallable': 'Install failed: this skill cannot be installed.',
|
||
'market.installError.generic': 'Install failed: {message}',
|
||
'market.catalog.summary': '{count} curated skills',
|
||
'market.catalog.updated': 'list updated {date}',
|
||
'market.catalog.liveResults': '{count} live results',
|
||
'market.scope.catalogHint': 'Searching curated skills only.',
|
||
'market.scope.marketHint': 'Searching all of ClawHub and SkillHub live; these results are not curated.',
|
||
'market.scope.searchMarket': 'Search all markets for “{q}”',
|
||
'market.scope.backToCatalog': 'Back to curated',
|
||
'market.scope.notCurated': 'Not curated',
|
||
'market.scope.livePlaceholder': 'Search all markets — press Enter to search',
|
||
'market.category.label': 'Category',
|
||
'market.category.all': 'All',
|
||
'market.featured': 'Featured',
|
||
'market.securityShort.verified': 'Verified',
|
||
'market.securityShort.benign': 'Scan passed',
|
||
'market.securityShort.unknown': 'Not scanned',
|
||
'market.securityShort.flagged': 'Flagged',
|
||
'market.detail.security': 'Security report',
|
||
'market.detail.changelog': 'Changelog',
|
||
'market.detail.whenToUse': 'When it triggers',
|
||
'market.detail.info': 'Info',
|
||
'market.detail.sourcePage': 'Source page',
|
||
'market.detail.updatedOn': 'Updated {date}',
|
||
'market.detail.by': 'by {author}',
|
||
'market.detail.readingTime': '~{minutes} min read',
|
||
'market.detail.scanReports': 'Scan results',
|
||
'market.detail.noReports': 'Upstream has no security scan for this skill.',
|
||
'market.detail.scanDisclaimer': 'Verdicts come from the upstream registry; this app only shows them and does not vouch for them. Installing means you trust the author.',
|
||
'market.detail.securityNote': 'Curator note',
|
||
'market.detail.noChangelog': 'Upstream has no release note for this version.',
|
||
'market.detail.flaggedDot': 'Flagged by the security scan',
|
||
'market.cap.title': 'Before installing: what this skill does',
|
||
'market.cap.viewReport': 'Full report →',
|
||
'market.cap.note': 'Detected by rules from SKILL.md and the file list; for reference only. Installing runs no scripts.',
|
||
'market.cap.shell': 'Runs commands or scripts',
|
||
'market.cap.shell.detail': '{evidence}',
|
||
'market.cap.hooks': 'Registers hooks',
|
||
'market.cap.hooks.detail': 'Touches {evidence}',
|
||
'market.cap.secrets': 'Needs secrets',
|
||
'market.cap.secrets.detail': 'Reads {evidence}',
|
||
'market.cap.network': 'Calls network services',
|
||
'market.cap.network.detail': 'Requests {evidence}',
|
||
'market.cap.writes': 'Writes files',
|
||
'market.cap.writes.detail': 'Creates or changes {evidence}',
|
||
'market.cap.binaries': 'Needs local commands',
|
||
'market.cap.binaries.detail': 'Requires {evidence}',
|
||
'market.cap.level.high': 'High',
|
||
'market.cap.level.medium': 'Medium',
|
||
'market.cap.level.low': 'Low',
|
||
'market.installConfirm.willGet': 'This skill will be able to',
|
||
'market.installConfirm.ack': 'I have read SKILL.md and the security report and understand these permissions',
|
||
|
||
// ─── Window controls / diagram + code viewers ──────────────────────────────────────
|
||
'windowControls.minimize': 'Minimize window',
|
||
'windowControls.maximize': 'Maximize window',
|
||
'windowControls.restore': 'Restore window',
|
||
'windowControls.close': 'Close window',
|
||
'mermaid.preview': 'Preview',
|
||
'mermaid.zoomOut': 'Zoom out',
|
||
'mermaid.zoomIn': 'Zoom in',
|
||
'mermaid.fit': 'Fit',
|
||
'mermaid.fitDiagram': 'Fit diagram',
|
||
'codeViewer.collapse': 'Collapse',
|
||
'codeViewer.showMoreLines': 'Show {count} more lines',
|
||
'common.copy': 'Copy',
|
||
|
||
// ─── Browser Panel ──────────────────────────────────────
|
||
'browser.back': 'Back',
|
||
'browser.forward': 'Forward',
|
||
'browser.reload': 'Reload',
|
||
'browser.addressPlaceholder': 'Enter a URL...',
|
||
'browser.zoomOut': 'Zoom out preview',
|
||
'browser.zoomIn': 'Zoom in preview',
|
||
'browser.zoomReset': 'Reset preview zoom',
|
||
'browser.capture': 'Screenshot',
|
||
'browser.pickElement': 'Select element',
|
||
'browser.selection.cancel': 'Cancel',
|
||
'browser.selection.sendOne': 'Send',
|
||
'browser.selection.queueAndContinue': 'Add & continue',
|
||
'browser.selection.add': 'Add',
|
||
'browser.selection.descriptionPlaceholder': 'Describe these changes…',
|
||
'browser.selection.draftCount': '{count} selected',
|
||
'browser.selection.undo': 'Undo last selection',
|
||
'browser.selection.clear': 'Clear selections',
|
||
'browser.selection.sendBatch': 'Send {count}',
|
||
'browser.selection.batchMessage': '{count} page changes',
|
||
'browser.selection.limitReached': 'Selection limit reached ({count}). Send or clear this batch to continue.',
|
||
'browser.selection.cleanupFailed': 'Could not stop or revert the extra selection: {reason}',
|
||
'browser.selection.navigationTitle': 'Leave this selection batch?',
|
||
'browser.selection.navigationBody': 'Navigating will discard the {count} selected elements and revert their previews.',
|
||
'browser.selection.navigationContinue': 'Discard and continue',
|
||
'browser.selection.navigationDiscarded': 'Cleared {count} selections after the page changed.',
|
||
'workflows.status.running': 'Running',
|
||
'workflows.status.completed': 'Completed',
|
||
'workflows.status.failed': 'Failed',
|
||
'workflows.status.stopped': 'Stopped',
|
||
'workflows.report.title': 'Dynamic workflow run',
|
||
'workflows.report.progressLabel': 'Progress of workflow {name}',
|
||
'workflows.report.waiting': 'Waiting for the first agent…',
|
||
'workflows.report.result': 'Result',
|
||
'workflows.ungroupedPhase': 'Ungrouped',
|
||
'workflows.meta.agents': '{count} agents',
|
||
'workflows.meta.tokens': '{tokens} tokens',
|
||
'workflows.meta.tools': '{count} tool calls',
|
||
'workflows.phase.counts': '{done}/{total} done',
|
||
'workflows.phase.failed': '{count} failed',
|
||
'workflows.agent.cached': 'Cached',
|
||
'workflows.dock.running': '{count} running',
|
||
'workflows.dock.expand': 'Show workflow details',
|
||
'workflows.dock.collapse': 'Hide workflow details',
|
||
'workflows.launcher.title': 'Run a workflow',
|
||
'workflows.launcher.hint': 'A workflow orchestrates many subagents from a saved script. It runs in the background and reports once.',
|
||
'workflows.launcher.empty': 'No saved workflows. Save one from a run, or drop a script in .claude/workflows/.',
|
||
'workflows.launcher.run': 'Run',
|
||
'workflows.launcher.argsLabel': 'Input passed to the script as args',
|
||
'workflows.workbench.title': 'Dynamic workflow workbench',
|
||
'workflows.workbench.close': 'Close workflow workbench',
|
||
'workflows.workbench.open': 'Open workflow workbench',
|
||
'workflows.workbench.closeDetail': 'Close agent details',
|
||
'workflows.workbench.counts': '{done}/{total} agents settled',
|
||
'workflows.workbench.runningCount': '{count} running',
|
||
'workflows.workbench.queued': '{count} queued',
|
||
'workflows.workbench.prompt': 'Prompt',
|
||
'workflows.workbench.detailTitle': 'Agent',
|
||
'workflows.history.title': 'Workflow history',
|
||
'workflows.history.empty': 'No past runs on this machine yet.',
|
||
'workflows.history.pick': 'Pick a run to see its script and per-agent results.',
|
||
'workflows.history.agents': '{count} agents recorded',
|
||
'workflows.history.script': 'Script',
|
||
'workflows.launcher.argsPlaceholder': 'e.g. a question, or a list of paths',
|
||
'settings.tab.voice': 'Voice Input',
|
||
'voice.settings.title': 'Voice Input',
|
||
'voice.settings.description': 'Dictate into the chat box with a speech model that runs on the machine hosting the cc-haha server. Audio is never sent to a cloud service.',
|
||
'voice.settings.loadFailed': 'Could not load voice input settings.',
|
||
'voice.settings.saveFailed': 'Could not save this setting. Please try again.',
|
||
'voice.settings.actionFailed': 'That action did not complete.',
|
||
'voice.settings.unsupported.title': 'Local speech recognition is not supported on this platform yet',
|
||
'voice.settings.unsupported.detail': 'Voice input needs a platform that the local speech runtime supports.',
|
||
'voice.settings.enable.label': 'Enable voice input',
|
||
'voice.settings.enable.description': 'Show a dictation button next to the chat box. Recorded audio is recognized on the machine that runs the cc-haha server.',
|
||
'voice.settings.enable.needModel': 'Voice input is on, but the speech model is not downloaded yet. Download it below; nothing is downloaded automatically.',
|
||
'voice.settings.engine.title': 'Recognition engine',
|
||
'voice.settings.engine.description': 'Choose the speech model and manage its files.',
|
||
'voice.settings.engine.provider': 'Engine',
|
||
'voice.settings.phase.unprepared': 'Not downloaded',
|
||
'voice.settings.phase.downloading': 'Downloading',
|
||
'voice.settings.phase.verifying': 'Verifying',
|
||
'voice.settings.phase.ready': 'Ready',
|
||
'voice.settings.phase.failed': 'Failed',
|
||
'voice.settings.phase.cancelled': 'Paused',
|
||
'voice.settings.step.runtime': 'Downloading speech runtime',
|
||
'voice.settings.step.model': 'Downloading speech model',
|
||
'voice.settings.step.vad': 'Downloading voice activity model',
|
||
'voice.settings.step.verify': 'Verifying files',
|
||
'voice.settings.model.unprepared': 'The speech model is not downloaded.',
|
||
'voice.settings.model.download': 'Download',
|
||
'voice.settings.model.meta': 'Local recognition · about {size}',
|
||
'voice.settings.model.downloading': 'Downloading',
|
||
'voice.settings.model.progress': '{completed} / {total}',
|
||
'voice.settings.model.resumed': 'Resumed from {size} that was already downloaded',
|
||
'voice.settings.model.source': 'Source: {source}',
|
||
'voice.settings.model.verifying': 'Verifying downloaded files…',
|
||
'voice.settings.model.ready': 'Local model is ready. It wakes up automatically when you record.',
|
||
'voice.settings.model.remove': 'Delete model',
|
||
'voice.settings.model.removeTitle': 'Delete the local speech model?',
|
||
'voice.settings.model.removeBody': 'This removes the downloaded runtime and model files. You will need to download them again before using voice input.',
|
||
'voice.settings.model.cancelled': 'Paused. Parts already downloaded are kept, so you can continue any time.',
|
||
'voice.settings.model.resume': 'Continue download',
|
||
'voice.settings.model.resumeHint': 'Parts already downloaded are kept. Retry once the network is back to continue where it stopped.',
|
||
'voice.settings.failure.network': 'Download failed: network connection problem',
|
||
'voice.settings.failure.dns': 'Download failed: could not resolve the download address',
|
||
'voice.settings.failure.timeout': 'Download failed: the connection timed out',
|
||
'voice.settings.failure.certificate': 'Download failed: the secure connection could not be verified',
|
||
'voice.settings.failure.http': 'Download failed: the server returned an error',
|
||
'voice.settings.failure.integrity': 'Download failed: the file check did not match, so the file will be downloaded again',
|
||
'voice.settings.failure.storage': 'Download failed: could not write to disk (check free space and permissions)',
|
||
'voice.settings.failure.unsupportedPlatform': 'This platform is not supported by the local speech runtime',
|
||
'voice.settings.failure.unknown': 'Download failed for an unknown reason',
|
||
'voice.settings.language.label': 'Language',
|
||
'voice.settings.downloadSource.label': 'Download source',
|
||
'voice.settings.downloadSource.auto': 'Automatic (first to respond)',
|
||
'voice.settings.downloadSource.official': 'Official (Hugging Face, npm)',
|
||
'voice.settings.downloadSource.mirror': 'China mirror (hf-mirror, npmmirror)',
|
||
'voice.settings.downloadSource.proxyHint': 'Downloads go through the network proxy in General (current: {mode}). A changed source applies to the next download.',
|
||
'voice.settings.downloadSource.changeProxy': 'Change proxy',
|
||
'voice.settings.language.auto': 'Auto detect',
|
||
'voice.settings.language.zh': 'Chinese (Mandarin)',
|
||
'voice.settings.language.en': 'English',
|
||
'voice.settings.language.ja': 'Japanese',
|
||
'voice.settings.language.ko': 'Korean',
|
||
'voice.settings.language.yue': 'Cantonese',
|
||
'voice.settings.mic.title': 'Microphone',
|
||
'voice.settings.mic.description': 'Choose which input device is used for dictation. This choice is saved on this device only.',
|
||
'voice.settings.mic.label': 'Input device',
|
||
'voice.settings.mic.systemDefault': 'System default',
|
||
'voice.settings.mic.savedDevice': 'Saved microphone',
|
||
'voice.settings.mic.unnamed': 'Microphone {index}',
|
||
'voice.settings.mic.missing': 'The microphone you chose earlier is not available. The system default is used instead.',
|
||
'voice.settings.mic.noDevices': 'No microphone was detected.',
|
||
'voice.settings.mic.allowAccess': 'Allow microphone access to show device names',
|
||
'voice.settings.mic.allowHint': 'The microphone opens briefly to unlock device names. Nothing is recorded.',
|
||
'voice.settings.capture.unsupported': 'The microphone is not available in this context. Open cc-haha on this computer or over HTTPS to record.',
|
||
'voice.settings.test.title': 'Transcription test',
|
||
'voice.settings.test.description': 'Record a short clip and see what the model recognizes, using the same path as dictation.',
|
||
'voice.settings.test.start': 'Start test',
|
||
'voice.settings.test.stop': 'Stop',
|
||
'voice.settings.test.starting': 'Starting…',
|
||
'voice.settings.test.transcribing': 'Recognizing…',
|
||
'voice.settings.test.level': 'Microphone level',
|
||
'voice.settings.test.needModel': 'Download the speech model above before testing.',
|
||
'voice.settings.test.result': 'Recognized text',
|
||
'voice.settings.test.stats': 'Audio {audio} s · Inference {inference} s',
|
||
'voice.settings.test.playback': 'Play back the recording',
|
||
'voice.composer.start': 'Dictate',
|
||
'voice.composer.starting': 'Opening microphone… (click to cancel)',
|
||
'voice.composer.stop': 'Stop recording and transcribe',
|
||
'voice.composer.transcribing': 'Transcribing…',
|
||
'voice.composer.recordingHint': 'Recording — press Esc to cancel',
|
||
'voice.composer.insertText': 'Insert text',
|
||
'voice.composer.discard': 'Discard',
|
||
'voice.composer.dismiss': 'Dismiss',
|
||
'voice.composer.pendingTitle': 'Dictated text',
|
||
'voice.composer.pendingHint': 'The draft changed while transcribing, so this was not added automatically.',
|
||
'voice.composer.error.permission': 'Microphone access was denied. Allow it in your system settings and try again.',
|
||
'voice.composer.error.noDevice': 'No microphone was found. Connect one and try again.',
|
||
'voice.composer.error.deviceBusy': 'The microphone is in use by another app.',
|
||
'voice.composer.error.unavailable': 'Dictation is not available in this environment.',
|
||
'voice.composer.error.interrupted': 'The microphone stopped unexpectedly. Recording was discarded.',
|
||
'voice.composer.error.notReady': 'The speech model is not ready. Check Settings → Voice input.',
|
||
'voice.composer.error.invalidAudio': 'The recording could not be read. Try again.',
|
||
'voice.composer.error.unknownProvider': 'The selected speech engine is unavailable.',
|
||
'voice.composer.error.failed': 'Transcription failed. Try again.',
|
||
'voice.composer.error.noSpeech': 'No speech was recognized.',
|
||
'voice.composer.error.tooShort': 'The recording was too short.',
|
||
'trajectory.switch.label': "Session view",
|
||
'trajectory.switch.chat': "Chat",
|
||
'trajectory.switch.trajectory': "Trajectory",
|
||
'trajectory.viewInTrajectory': "View in trajectory",
|
||
'trajectory.loading': "Loading trajectory…",
|
||
'trajectory.loadFailed': "Couldn't load the trajectory",
|
||
'trajectory.empty.title': "No trajectory yet",
|
||
'trajectory.empty.description': "Send a message and every model call, tool call and injected context will show up here.",
|
||
'trajectory.kind.system': "System",
|
||
'trajectory.kind.user': "User",
|
||
'trajectory.kind.context': "Context",
|
||
'trajectory.kind.assistant': "Assistant",
|
||
'trajectory.kind.tool': "Tool",
|
||
'trajectory.kind.compact': "Compact",
|
||
'trajectory.turn.n': "Turn {n}",
|
||
'trajectory.turn.before': "Start",
|
||
'trajectory.system.initial': "Initial system prompt",
|
||
'trajectory.system.updated': "System prompt updated",
|
||
'trajectory.system.toolsUpdated': "Tools updated",
|
||
'trajectory.system.bothUpdated': "System prompt and tools updated",
|
||
'trajectory.system.userContext': "User context (CLAUDE.md, date)",
|
||
'trajectory.system.chars': "{count} chars",
|
||
'trajectory.context.skill': "Skill",
|
||
'trajectory.context.skillListing': "Skill list",
|
||
'trajectory.context.invokedSkills': "Invoked skills",
|
||
'trajectory.context.dynamicSkill': "Dynamic skill",
|
||
'trajectory.context.skillDiscovery': "Skill discovery",
|
||
'trajectory.context.meta': "Injected",
|
||
'trajectory.context.summary': "Compact summary",
|
||
'trajectory.context.userContext': "User context",
|
||
'trajectory.context.todoReminder': "Todo reminder",
|
||
'trajectory.context.taskReminder': "Task reminder",
|
||
'trajectory.context.memory': "Memory",
|
||
'trajectory.context.planMode': "Plan mode",
|
||
'trajectory.context.autoMode': "Auto mode",
|
||
'trajectory.context.dateChange': "Date change",
|
||
'trajectory.context.toolsDelta': "Tool changes",
|
||
'trajectory.context.agentsDelta': "Agent list",
|
||
'trajectory.context.mcpInstructions': "MCP instructions",
|
||
'trajectory.context.mcpResource': "MCP resource",
|
||
'trajectory.context.reminder': "System reminder",
|
||
'trajectory.context.diagnostics': "Diagnostics",
|
||
'trajectory.context.file': "File",
|
||
'trajectory.context.fileChange': "File change",
|
||
'trajectory.context.ide': "IDE",
|
||
'trajectory.context.queued': "Queued input",
|
||
'trajectory.context.taskStatus': "Task status",
|
||
'trajectory.context.budget': "Budget",
|
||
'trajectory.context.team': "Team",
|
||
'trajectory.context.apiError': "API error",
|
||
'trajectory.context.hook': "Hook",
|
||
'trajectory.context.taskNotification': "Task notification",
|
||
'trajectory.context.commandOutput': "Command output",
|
||
'trajectory.context.interrupted': "Interrupted",
|
||
'trajectory.user.queued': "Queued",
|
||
'trajectory.assistant.toolOnly': "(tool calls only)",
|
||
'trajectory.assistant.thinkingOnly': "(thinking only)",
|
||
'trajectory.tool.unknown': "Tool",
|
||
'trajectory.tool.running': "Running…",
|
||
'trajectory.tool.emptyResult': "(empty)",
|
||
'trajectory.compact.title': "Context compacted",
|
||
'trajectory.status.done': "Done",
|
||
'trajectory.status.error': "Failed",
|
||
'trajectory.table.label': "Trajectory",
|
||
'trajectory.table.folded': "{count} more rows",
|
||
'trajectory.table.toolCount': "{count} tools",
|
||
'trajectory.table.collapseTurn': "Collapse {turn}",
|
||
'trajectory.table.expandTurn': "Expand {turn}",
|
||
'trajectory.table.loadOlder': "Load earlier records",
|
||
'trajectory.table.searchLoaded': "Searching loaded records only · load earlier",
|
||
'trajectory.minimap.input': "Input",
|
||
'trajectory.minimap.model': "Model",
|
||
'trajectory.minimap.tools': "Tools",
|
||
'trajectory.toolbar.duration': "By duration",
|
||
'trajectory.toolbar.collapseTurns': "Fold turns",
|
||
'trajectory.toolbar.hideTools': "Hide tools",
|
||
'trajectory.toolbar.search': "Search trajectory",
|
||
'trajectory.toolbar.clearSearch': "Clear search",
|
||
'trajectory.toolbar.totals': "{turns} turns · {steps} steps · {tools} tool calls · {tokens} tok",
|
||
'trajectory.toolbar.cacheHit': "cache hit {percent}%",
|
||
'trajectory.subagent.breadcrumb': "Subagent trajectory",
|
||
'trajectory.subagent.main': "Main session",
|
||
'trajectory.subagent.view': "View subagent trajectory",
|
||
'trajectory.tab.overview': "Overview",
|
||
'trajectory.tab.preview': "Preview",
|
||
'trajectory.tab.input': "Input",
|
||
'trajectory.tab.output': "Result",
|
||
'trajectory.tab.raw': "Raw",
|
||
'trajectory.tab.request': "Raw request",
|
||
'trajectory.tab.prompt': "System prompt",
|
||
'trajectory.tab.tools': "Tools",
|
||
'trajectory.tab.context': "Content",
|
||
'trajectory.tab.diff': "Diff",
|
||
'trajectory.detail.label': "Trajectory details",
|
||
'trajectory.detail.tabs': "Detail sections",
|
||
'trajectory.detail.resize': "Resize details panel",
|
||
'trajectory.detail.copy': "Copy",
|
||
'trajectory.detail.loadFailed': "Failed to load: {error}",
|
||
'trajectory.detail.notLoaded': "Not available in this record",
|
||
'trajectory.detail.truncated': "Content is too large; only the beginning is shown.",
|
||
'trajectory.detail.empty': "Nothing to show",
|
||
'trajectory.detail.time': "Time",
|
||
'trajectory.detail.source': "Source",
|
||
'trajectory.detail.status': "Status",
|
||
'trajectory.detail.model': "Model",
|
||
'trajectory.detail.stopReason': "Stop reason",
|
||
'trajectory.detail.tokens': "Tokens",
|
||
'trajectory.detail.tokenBreakdown': "in {input} · cache read {cacheRead} · cache write {cacheWrite} · out {output}",
|
||
'trajectory.detail.duration': "Duration",
|
||
'trajectory.detail.approx': "≈ {value}",
|
||
'trajectory.detail.issuedBy': "Issued by",
|
||
'trajectory.detail.locateInChat': "Locate in chat",
|
||
'trajectory.detail.thinking': "Thinking",
|
||
'trajectory.detail.resultText': "Result sent to the model",
|
||
'trajectory.detail.resultStructured': "Structured result",
|
||
'trajectory.detail.systemPrompt': "System prompt · {count} chars",
|
||
'trajectory.detail.systemPromptDiff': "System prompt changes",
|
||
'trajectory.detail.toolsDiff': "Tool changes",
|
||
'trajectory.detail.toolsAdded': "Added",
|
||
'trajectory.detail.toolsRemoved': "Removed",
|
||
'trajectory.detail.toolsChanged': "Changed",
|
||
'trajectory.detail.noChanges': "No changes",
|
||
'trajectory.detail.unchangedLines': "{count} unchanged lines",
|
||
'trajectory.request.closest': "Closest captured call by time. Requests and the transcript are recorded separately, so the pairing is approximate.",
|
||
'trajectory.toolbar.durationHint': "Lay the minimap out by real duration, so slow calls take more width",
|
||
'trajectory.toolbar.loadedFrom': "From turn {turn} (loaded)",
|
||
'trajectory.toolbar.matches': "{count} matches",
|
||
'trajectory.toolbar.totalsHint': "Counts cover the loaded records and exclude subagents' own tokens",
|
||
'trajectory.table.errorCount': "{count} failed",
|
||
'trajectory.table.usageTitle': "Input tokens including cache ↑ / output tokens ↓",
|
||
'trajectory.table.usageShort': "{input}↑ {output}↓",
|
||
'trajectory.tool.callEarlier': "(call is in earlier history)",
|
||
'trajectory.tool.resultTooLarge': "Result too large to load ({size})",
|
||
'trajectory.tool.noResult': "No result",
|
||
'trajectory.minimap.label': "Trajectory minimap: input, model and tool lanes",
|
||
'trajectory.search.noResults': "No matching records",
|
||
'trajectory.search.noResultsHint': "Try another keyword.",
|
||
'trajectory.search.noResultsPartial': "Only loaded records were searched. Load earlier records and search again.",
|
||
'trajectory.detail.back': "Back to list",
|
||
'trajectory.detail.images': "Contains {count} image(s)",
|
||
'trajectory.request.captureToggle': "Record raw requests (Agent Trace)",
|
||
'trajectory.request.captureHint': "New model calls will save the request actually sent and the response received.",
|
||
'trajectory.request.uncaptured': "Raw request recording was off when this response ran.",
|
||
'trajectory.request.unmatched': "No captured call matches this response.",
|
||
'trajectory.user.command': "Command",
|
||
'trajectory.user.sessionMessage': "Session message",
|
||
'trajectory.context.apiRetry': "API retry",
|
||
'trajectory.context.localCommand': "Local command",
|
||
'trajectory.context.streamRetry': "Stream retry",
|
||
'trajectory.context.informational': "Notice",
|
||
'trajectory.context.awaySummary': "Away summary",
|
||
'trajectory.context.scheduledTask': "Scheduled task",
|
||
'trajectory.context.environment': "Environment",
|
||
'trajectory.context.instructions': "Instructions",
|
||
'trajectory.context.sessionContext': "Session context",
|
||
'trajectory.context.permissionRetry': "Permission granted",
|
||
'trajectory.context.memorySaved': "Memory saved",
|
||
'trajectory.context.agentsKilled': "Agents stopped",
|
||
'trajectory.context.modelFallback': "Model fallback",
|
||
'trajectory.request.endpoint': "Endpoint",
|
||
'trajectory.request.provider': "Provider",
|
||
'trajectory.request.route': "Route",
|
||
'trajectory.request.routeDirect': "Sent directly by the SDK",
|
||
'trajectory.request.routeProxy': "Translated by the local proxy, then sent upstream",
|
||
'trajectory.request.model': "Model",
|
||
'trajectory.request.upstreamModel': "Sent upstream as",
|
||
'trajectory.request.respondedModel': "Answered by",
|
||
'trajectory.request.status': "Result",
|
||
'trajectory.request.requestId': "Request ID",
|
||
'trajectory.request.purpose': "Purpose",
|
||
} as const
|
||
|
||
export type TranslationKey = keyof typeof en
|