Files
qwen-code/packages/web-shell/client/i18n.tsx
T
ytahdnand钉萁 df5470e430 feat(web-shell): Add workspace file browser and previews (#13878)
* feat(web-shell): Add workspace file browser and previews

* fix(web-shell): Restore source preview CI fixtures and notices

* fix(web-shell): Address file pane review blockers

* fix(web-shell): Resolve review regressions and strengthen file checks

---------

Co-authored-by: 钉萁 <[email protected]>
2026-10-13 09:38:47 +00:00

8552 lines
441 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
FILES_MESSAGES_EN,
FILES_MESSAGES_ZH,
} from './components/artifacts/files-messages.js';
import {
createContext,
useContext,
useMemo,
type PropsWithChildren,
} from 'react';
import {
TRAJECTORY_FILTER_MESSAGES_EN,
TRAJECTORY_FILTER_MESSAGES_ZH,
} from './trajectory/filter-messages.js';
import {
TRAJECTORY_WINDOW_MESSAGES_EN,
TRAJECTORY_WINDOW_MESSAGES_ZH,
} from './trajectory/window-messages.js';
import { VOICE_MESSAGES_EN, VOICE_MESSAGES_ZH } from './voice/messages.js';
import { LIVE_MESSAGES_EN, LIVE_MESSAGES_ZH } from './live/messages.js';
import {
COLLAB_MESSAGES_EN,
COLLAB_MESSAGES_ZH,
} from './components/workspace-agents/messages.js';
import {
SETTINGS_MESSAGES_EN,
SETTINGS_MESSAGES_ZH,
} from './settings/messages.js';
import {
MANAGED_TASK_MESSAGES_EN,
MANAGED_TASK_MESSAGES_ZH,
} from './components/managed/managed-task-messages.js';
export const WEB_SHELL_LANGUAGES = ['en', 'zh-CN'] as const;
export type WebShellLanguage = (typeof WEB_SHELL_LANGUAGES)[number];
type MessageValue =
| string
| ((vars?: Record<string, string | number>) => string);
type Messages = Record<string, MessageValue>;
/** English count plus its noun, pluralised the regular way. */
function plural(count: string | number | undefined, noun: string): string {
const value = typeof count === 'number' ? count : Number(count ?? 0);
const safe = Number.isFinite(value) ? value : 0;
return `${safe} ${noun}${safe === 1 ? '' : 's'}`;
}
const EN: Messages = {
'capacityChoice.persistenceUnconfirmed':
'Saving the last interrupted turn could not be confirmed.',
'capacityChoice.title': 'Choose a workspace to stop',
'capacityChoice.description':
'No ACP capacity is available. Choose a workspace whose sessions you want to stop, or cancel and keep working.',
'capacityChoice.warning':
'Stopping interrupts all listed sessions and their tools. Files, workspace registration and saved history remain. Unsaved work may be lost. Closing this dialog after confirmation does not undo the stop.',
'capacityChoice.outdated':
'The draft, session or daemon has changed. Cancel and try the original operation again.',
'capacityChoice.inProgress':
'The selected stop is still being resolved. Refresh its status before continuing.',
'capacityChoice.failedUnreleased':
'The stop failed. This workspace remains unavailable until its old processes are confirmed stopped. Capacity is still reserved. Refresh to check cleanup.',
'capacityChoice.failedUnknownCleanup':
'The stop failed. Cleanup could not be confirmed. Refresh its status before continuing.',
'capacityChoice.workspaces': 'Workspace to stop',
'capacityChoice.requester':
'This workspace owns the operation you are trying to continue.',
'capacityChoice.running': 'Running',
'capacityChoice.waiting': 'Waiting for your response',
'capacityChoice.background': 'Background work running',
'capacityChoice.backgroundUnknown': 'Background work status unknown',
'capacityChoice.none':
'No workspace can currently be stopped here. Review the reasons above, stop the independent work, or cancel.',
'capacityChoice.refresh': 'Refresh status',
'capacityChoice.continue': 'Continue original operation',
'capacityChoice.confirm': 'Stop these sessions and continue',
'capacityChoice.stopped':
'This workspace was stopped to free ACP capacity. Resume this conversation when needed.',
'capacityChoice.resume': 'Resume conversation',
'capacityChoice.blocked.stopping': 'Stopping',
'capacityChoice.blocked.not_live': 'No live ACP',
'capacityChoice.blocked.release_unavailable':
'Owned process release cannot be observed',
'capacityChoice.blocked.session_start_pending':
'Session startup or restore in progress',
'capacityChoice.blocked.workspace_control_pending':
'Workspace management or MCP work in progress',
'capacityChoice.blocked.session_closing':
'Session close or reset in progress',
'capacityChoice.blocked.runtime_unavailable':
'Workspace unavailable or untrusted',
'capacityChoice.blocked.special_runtime': 'Special-purpose workspace',
'capacityChoice.blocked.unsupported': 'Runtime stop is not supported',
'capacityChoice.blocked.activity_unknown': 'Activity could not be observed',
'capacityChoice.blocked.pendingSessionStarts': 'Session startup pending',
'capacityChoice.blocked.acpConnections': 'An ACP client is connected',
'capacityChoice.blocked.memoryTasks': 'Memory task running',
'capacityChoice.blocked.channelWorkers': 'Channel worker running',
'capacityChoice.blocked.voiceSessions': 'Voice session active',
'capacityChoice.blocked.management_pending': 'Workspace management pending',
'capacityChoice.blocked.scheduler_pending':
'Scheduled session restore in progress',
'capacityChoice.blocked.enabled_scheduled_tasks':
'Disable enabled scheduled tasks first',
'capacityChoice.blocked.scheduled_tasks_unknown':
'Scheduled tasks could not be read',
'capacityChoice.capacity': (v) => `ACP capacity: ${v?.used} / ${v?.limit}`,
'capacityChoice.sessions': (v) => `${v?.count} loaded session(s)`,
'capacityChoice.queued': (v) => `${v?.count} queued`,
'capacityChoice.outcome': (v) =>
`${v?.closed} session(s) closed; ${v?.remaining} remaining.`,
'footnotes.note': (v) => `Footnote ${v?.number ?? ''}`,
'footnotes.references': (v) => `View ${v?.count ?? ''} references`,
'footnotes.preview': 'Reference preview',
'footnotes.previous': 'Previous reference',
'footnotes.next': 'Next reference',
'footnotes.citations': (v) =>
`${v?.count ?? 0} ${v?.count === 1 ? 'citation' : 'citations'}`,
'daemon.capacity.exhausted':
'The service has reached its concurrent capacity limit and cannot start this session. Try again later or cancel this operation.',
'managed.title': 'Managed Agents',
'managed.sessions': 'Managed sessions',
'managed.conversation': 'Managed conversation',
'managed.new': 'New managed task',
'managed.refresh': 'Refresh',
'managed.empty': 'No managed tasks yet.',
'managed.loading': 'Loading…',
'managed.more': 'Load more',
'managed.prompt': 'Message the managed agent',
'managed.runtime': 'Environment',
'managed.unavailable': 'Managed Agents is unavailable on this daemon.',
'managed.send': 'Send',
'managed.sending': 'Submitting…',
'managed.elapsed': (v) => `${v?.seconds ?? 0}s elapsed`,
'managed.runningHint':
'This turn is running. Sending another message is paused.',
'managed.retry': 'Retry the same request',
'managed.cancel': 'Cancel turn',
'managed.uncertain':
'The request outcome is unconfirmed. Retry to check or complete the same submission.',
'managed.discard': 'Discard this request',
'managed.discarded': 'Request discarded. The draft is back in the composer.',
'managed.newRequired': 'Start a new task to send another message.',
'managed.truncated': '[Details truncated]',
'managed.approval.failed':
'The approval answer could not be confirmed. Retry the same option or refresh to check its status.',
'managed.approval.loadFailed': 'Pending approvals could not be loaded.',
'managed.approval.refreshFailed': 'Pending approvals could not be refreshed.',
'managed.approval.retry': 'Retry loading approvals',
'managed.approval.forbidden':
"Only the Session's owner or a Workspace operator can answer this approval.",
'managed.approval.argumentsUnavailable':
'Tool arguments are unavailable for this approval.',
'managed.approval.previewComplete': (v) =>
`Input preview: ${v?.bytes ?? 0} bytes.`,
'managed.approval.previewTruncated': (v) =>
`Input preview truncated. Full input: ${v?.bytes ?? 0} bytes.`,
'managed.result.range': (v) => `Bytes ${v?.start}–${v?.end} of ${v?.total}`,
'managed.result.outputs': 'Outputs',
'managed.result.view': 'View output',
'managed.result.empty': 'No published output yet.',
'managed.result.description':
'Read saved output without running the command again.',
'managed.result.preview': 'Approved preview',
'managed.result.previewTruncated':
'Preview clipped; this does not mean the captured output is incomplete.',
'managed.result.execution.success': 'Command succeeded',
'managed.result.execution.error': 'Command failed',
'managed.result.execution.cancelled': 'Command cancelled',
'managed.result.execution.not_started': 'Command not executed',
'managed.result.capture.complete': 'Capture complete',
'managed.result.capture.partial': 'Capture incomplete',
'managed.result.capture.unavailable': 'Capture unavailable',
'managed.result.capture.none': 'No capture',
'managed.result.delivery.pending': 'Saving output',
'managed.result.delivery.committed': 'Output saved',
'managed.result.delivery.blocked': 'Output delivery blocked',
'managed.result.forbidden':
'Original output is not available to your account.',
'managed.result.unavailable': 'Saved bytes are currently unavailable.',
'managed.result.downloadUnsupported':
'This browser needs a host integration to save a streaming download.',
'managed.result.previous': 'Previous page',
'managed.result.next': 'Next page',
'managed.result.expired': 'This output revision has expired.',
'managed.result.changed':
'This output revision changed. Refresh to choose the current revision.',
'managed.result.reading': 'Reading output…',
'managed.result.emptyStream': 'Empty output (0 bytes)',
'managed.result.close': 'Close output',
'managed.result.refresh': 'Refresh output',
'managed.phase.created': 'Created',
'managed.workspaceCreateTitle': 'Create a Workspace session',
'managed.workspaceLabel': 'Workspace',
'managed.modelPreset': 'Model / Agent preset',
'managed.modelDefault': 'Server default model',
'managed.modelPinned':
'This model is fixed for the new session. Start a new session to use another model or Workspace.',
'managed.workspaceChoose': 'Choose a Workspace',
'managed.workspaceDirectory': 'Relative directory',
'managed.cwd.change': 'Change directory',
'managed.cwd.path': 'Directory relative to Workspace root',
'managed.cwd.description':
'Enter a path relative to the Workspace root. Use . for the root. Future tasks run in the new directory; conversation history is kept.',
'managed.cwd.close': 'Close',
'managed.cwd.changing': 'Changing directory…',
'managed.cwd.confirm': 'Continue confirming',
'managed.cwd.unconfirmed':
'The directory change is not confirmed yet. Continue confirming the original request.',
'managed.cwd.unconfirmedForbidden':
'Your account cannot confirm this change. Its result remains unconfirmed, and sending stays blocked until the server settles it or you open a new tab.',
'managed.cwd.busy':
'Finish the active task, approval or unconfirmed request before changing directory.',
'managed.cwd.invalid': 'The directory is invalid or cannot be accessed.',
'managed.cwd.conflict':
'The current directory has changed. Review it before submitting again.',
'managed.cwd.unavailable':
'The Workspace is currently unavailable for a directory change.',
'managed.cwd.forbidden':
'Your account does not have permission to change this directory.',
'managed.cwd.storage':
'Browser session storage is unavailable. The directory change cannot start safely.',
'managed.cwd.failed':
'The directory change failed. Review the current directory before trying again.',
'managed.cwd.updated': (v) =>
`The current directory changed to ${v?.cwd ?? ''}. Confirm this context before submitting.`,
'managed.cwd.useCurrent': 'Use the current directory context',
'managed.workspaceCreate': 'Create session',
'managed.workspaceBound': 'Bound Workspace',
'managed.workspaceExecutionUnavailable':
'Workspace is bound. You cannot send messages in this Session.',
'managed.workspaceSharedFiles':
'Sessions in the same Workspace share files. Directory availability is checked before execution.',
'managed.workspaceEmpty': 'No readable Workspaces are available.',
'managed.workspaceUnsupported':
'This service does not support Workspace binding.',
'managed.workspacePermission':
'You do not have permission to discover Workspaces.',
'managed.workspaceLoadFailed': 'Could not load Workspaces.',
'managed.workspaceStorageUnavailable':
'Browser session storage is unavailable. Creation cannot start safely.',
'managed.workspaceUncertain':
'Creation is unconfirmed. Retry the saved request or read the saved session.',
'managed.workspaceRetryRead': 'Retry reading session',
'managed.workspaceSessionId': 'Session ID',
'managed.workspaceProtocolError': (v) =>
`Session ${v?.sessionId ?? ''} was created, but its Workspace binding could not be confirmed.`,
'managed.workspaceAbandon': 'Abandon local confirmation',
'managed.workspaceAbandonWarning':
'The original empty session may still exist. Abandoning this record does not delete it.',
'managed.workspaceAbandonInputWarning':
'A session with this input may already exist or be running. Abandoning this record does not cancel it. Sending it again starts a new request and may repeat its effects.',
'managed.workspaceSwitchTitle': 'Switch Workspace?',
'managed.workspaceSwitchDescription':
'Switching resets the relative directory to the Workspace root.',
'managed.workspaceKeep': 'Keep selection',
'managed.workspaceSwitch': 'Switch',
'managed.phase.admitted': 'Accepted',
'managed.phase.runtime_starting': 'Preparing environment',
'managed.phase.agent_running': 'Thinking / responding',
'managed.phase.waiting_runtime': 'Waiting for environment',
'managed.phase.tool_running': 'Executing tool',
'managed.phase.cancelling': 'Cancelling',
'managed.phase.completed': 'Completed',
'managed.phase.failed': 'Failed',
'managed.phase.cancelled': 'Cancelled',
'managed.runtime.unknown': 'Unknown',
'managed.runtime.starting': 'Preparing',
'managed.runtime.ready': 'Ready',
'managed.runtime.failed': 'Preparation failed',
'git.currentBranch': (v) => `Current Git branch: ${v?.branch ?? ''}`,
'git.detached': 'Detached HEAD',
'git.clean': 'Working tree clean',
'git.operation.merge': 'Merging',
'git.operation.rebase': 'Rebasing',
'git.operation.cherry-pick': 'Cherry-picking',
'git.operation.revert': 'Reverting',
'git.operation.bisect': 'Bisecting',
'git.conflicted': (v) => `${v?.count ?? 0} conflicted`,
'git.staged': (v) => `${v?.count ?? 0} staged`,
'git.unstaged': (v) => `${v?.count ?? 0} modified`,
'git.untracked': (v) => `${v?.count ?? 0} untracked`,
'git.ahead': (v) => `${v?.count ?? 0} ahead`,
'git.behind': (v) => `${v?.count ?? 0} behind`,
'git.stash': (v) => `${v?.count ?? 0} stashed`,
'branchPicker.label': 'Git',
'branchPicker.search': 'Search for branches and actions',
'branchPicker.loading': 'Loading branches…',
'branchPicker.noBranches': 'No branches',
'branchPicker.noTags': 'No tags',
'branchPicker.action.pull': 'Update Project',
'branchPicker.action.push': 'Push',
'branchPicker.action.commit': 'Commit',
'branchPicker.action.newBranch': 'New Branch…',
'branchPicker.action.checkoutRef': 'Checkout Tag or Revision…',
'branchPicker.action.viewChanges': 'View Changes',
'branchPicker.action.worktrees': 'Worktrees…',
'branchPicker.action.history': 'History',
'branchPicker.newBranchPlaceholder': 'Branch name',
'branchPicker.invalidBranchName':
'Invalid branch name — avoid spaces, ~, ^, :, ? * and leading -',
'branchPicker.checkoutRefPlaceholder': 'Tag name or commit SHA',
'branchPicker.section.recent': 'Recent',
'branchPicker.section.local': 'Local',
'branchPicker.section.remote': 'Remote',
'branchPicker.section.tags': 'Tags',
'branchPicker.checkedOut': (v) => `Checked out ${v?.branch ?? ''}`,
'branchPicker.createdBranch': (v) => `Created branch ${v?.branch ?? ''}`,
'branchPicker.pushSuccess': 'Pushed successfully',
'branchPicker.pullSuccess': 'Updated successfully',
'branchPicker.pullBlocked': 'Update blocked by uncommitted changes',
'branchPicker.pullStash': 'Stash Changes and Update',
'branchPicker.pullDiscard': 'Discard Changes and Update…',
'branchPicker.pullDiscardConfirm':
'Discard ALL uncommitted changes (including untracked files)? This cannot be undone.',
'branchPicker.pullDiscardGo': 'Discard and Update',
'branchPicker.pullStashConflict': (v) =>
`Updated, but restoring your stashed changes failed. They are kept in stash entry ${String(v?.sha ?? '').slice(0, 12) || '(see git stash list)'} — resolve any conflict markers, then restore it manually.`,
'branchPicker.cancel': 'Cancel',
'branchPicker.hint.upToDate': 'Up to date',
'branchPicker.hint.noUpstream': 'No upstream',
'branchPicker.hint.upstreamGone': 'Upstream gone',
'branchPicker.hint.behindDirty': (v) =>
`↓${v?.count ?? 0} · uncommitted changes`,
'branchPicker.hint.setsUpstream': 'Sets upstream on push',
'branchPicker.hint.createsPushBranch': (v) => `Creates ${v?.target ?? ''}`,
'branchPicker.hint.aheadBehind': (v) =>
`↑${v?.ahead ?? 0} ↓${v?.behind ?? 0} · diverged`,
'branchPicker.hint.nothingToPush': 'Nothing to push',
'branchPicker.hint.noChanges': 'No changes',
'branchPicker.hint.changes': (v) =>
`${v?.count ?? 0} ${v?.count === 1 ? 'change' : 'changes'}`,
'branchPicker.hint.changesUntracked': (v) =>
`${v?.count ?? 0} ${v?.count === 1 ? 'change' : 'changes'} (${v?.untracked ?? 0} untracked)`,
'branchPicker.action.manageRemotes': 'Manage Remotes…',
'branchPicker.remotes.title': 'Remotes',
'branchPicker.remotes.back': 'Back to branches',
'branchPicker.remotes.loading': 'Loading remotes…',
'branchPicker.remotes.empty': 'No remotes configured',
'branchPicker.remotes.noMatches': 'No remotes match the search',
'branchPicker.remotes.namePlaceholder': 'Remote name',
'branchPicker.remotes.urlPlaceholder': 'Remote URL',
'branchPicker.remotes.add': 'Add',
'branchPicker.remotes.remove': (v) => `Remove ${v?.name ?? ''}`,
'branchPicker.remotes.removeConfirm': 'Confirm',
'branchPicker.remotes.removeConfirmFor': (v) =>
`Confirm removing ${v?.name ?? ''}${v?.extras ? ` (${v.extras})` : ''}`,
'branchPicker.remotes.invisibleName': '(invisible name)',
'branchPicker.remotes.hiddenChars': '(hidden characters)',
'branchPicker.remotes.lookalikeName': '(lookalike name)',
'branchPicker.remotes.searchPlaceholder': 'Search remotes',
'branchPicker.remotes.urlTooltipFetch': (v) => `fetch: ${v?.url ?? ''}`,
'branchPicker.remotes.urlTooltipPush': (v) => `push: ${v?.url ?? ''}`,
'branchPicker.remotes.promisor': 'partial clone',
'branchPicker.remotes.partialClone': (v) => `partial clone (${v?.filter})`,
'branchPicker.remotes.customRefspec': 'custom refspec',
'branchPicker.remotes.extraUrls': (v) =>
`+${v?.count ?? 0} ${v?.count === 1 ? 'URL' : 'URLs'}`,
'branchPicker.remotes.otherSettings': (v) =>
`${v?.count ?? 0} ${v?.count === 1 ? 'other setting' : 'other settings'}`,
'branchPicker.remotes.added': (v) => `Added remote ${v?.name ?? ''}`,
'branchPicker.remotes.removed': (v) => `Removed remote ${v?.name ?? ''}`,
'branchPicker.remotes.invalidInput':
'Enter a remote name and URL (no leading -)',
'gitCommit.title': 'Commit',
'gitCommit.messagePlaceholder': 'Commit message (⌘/Ctrl+Enter to commit)',
'gitCommit.generating': 'Generating commit message…',
'gitCommit.genFailed': 'Auto-generation failed — write your message',
'gitCommit.prLogUnavailable':
'Could not load commits for the selected base branch.',
'gitCommit.prPushFirst':
'Push your branch to a remote before creating a pull request.',
'gitCommit.commit': 'Commit',
'gitCommit.commitAndPush': 'Commit and Push',
'gitCommit.createPr': 'Create Pull Request',
'gitCommit.prTitlePlaceholder': 'Pull request title',
'gitCommit.prBodyPlaceholder': 'Description (optional)',
'gitCommit.prEdit': 'Edit',
'gitCommit.prPreview': 'Preview',
'gitCommit.prSubmit': 'Create',
'gitCommit.prCreated': (v) => `Pull Request #${v?.number ?? ''} created`,
'gitCommit.commitSuccess': (v) => `Committed ${v?.sha ?? ''}`,
'gitCommit.commitPushSuccess': (v) => `Committed & pushed ${v?.sha ?? ''}`,
'gitCommit.commitSuccessPushFailed': (v) =>
`Committed ${v?.sha ?? ''} — push failed: ${v?.error ?? 'unknown'}`,
'branchSelect.baseBranch': 'Base branch',
'branchSelect.search': 'Search branches…',
'branchSelect.loading': 'Loading…',
'branchSelect.noMatches': 'No matches',
'branchSelect.error': 'Failed to load branches',
'branchSelect.retry': 'Retry',
'branchSelect.local': 'local',
'gitDiff.title': 'Changes',
'gitDiff.summary': (v) =>
`${v?.count ?? 0} files · +${v?.added ?? 0} −${v?.removed ?? 0}`,
'gitDiff.loading': 'Loading changes…',
'gitDiff.empty': 'No changes in the working tree',
'gitDiff.unavailable': 'Git is not available for this workspace',
'gitDiff.error': 'Failed to load changes',
'gitDiff.binary': 'Binary',
'gitDiff.untracked': 'Untracked',
'gitDiff.deleted': 'Deleted',
'gitDiff.noDiff': 'No changes to display',
'gitDiff.fileError': 'Failed to load this diff',
'gitDiff.truncated': 'Diff truncated — the file is too large to show in full',
'gitDiff.hidden': (v) => `${v?.count ?? 0} more file(s) not shown`,
'gitDiff.expand': (v) => `Show changes for ${v?.path ?? 'file'}`,
'gitDiff.collapse': (v) => `Hide changes for ${v?.path ?? 'file'}`,
'gitMode.title': 'Git mode',
'gitMode.current': 'Current branch',
'gitMode.currentDesc': (v) => `Develop directly on ${v?.branch ?? 'main'}`,
'gitMode.branch': 'New branch',
'gitMode.branchDesc': (v) =>
`Create a new branch from ${v?.branch ?? 'main'}`,
'gitMode.branchPlaceholder': 'feat/my-feature',
'gitMode.branchLabel': 'Branch name',
'gitMode.branchConflictWarning':
'Only one branch session per workspace at a time',
'gitMode.branchHint': 'Switches the working directory to a new branch',
'gitMode.branchInvalidName': 'Invalid branch name',
'gitMode.worktree': 'Worktree',
'gitMode.worktreeDesc':
'Creates an isolated copy when you send your first message',
'gitMode.confirmBranch': 'Create branch',
'gitMode.resetToCurrent': 'Reset to current branch',
'gitLog.title': 'History',
'gitLog.subtitle': (v) => `${v?.count ?? 0} commits`,
'gitLog.loading': 'Loading history…',
'gitLog.empty': 'No commits yet',
'gitLog.unavailable': 'Git is not available for this workspace',
'gitLog.error': 'Failed to load history',
'gitLog.loadMore': 'Load more',
'gitLog.loadingMore': 'Loading…',
'gitLog.files': (v) =>
`${v?.count ?? 0} files · +${v?.added ?? 0} −${v?.removed ?? 0}`,
'gitLog.detailError': 'Failed to load commit details',
'gitLog.hidden': (v) => `${v?.count ?? 0} more file(s) not shown`,
'gitLog.copySha': (v) => `Copy commit ${v?.sha ?? ''}`,
'gitLog.allBranches': 'All branches',
'gitLog.search': 'Search message, author, or hash',
'gitLog.noMatches': 'No commits match',
'gitWorktrees.title': 'Worktrees',
'gitWorktrees.subtitle': (v) => `${v?.count ?? 0} worktrees`,
'gitWorktrees.loading': 'Loading worktrees…',
'gitWorktrees.error': 'Failed to load worktrees',
'gitWorktrees.unavailable': 'Git is not available for this workspace',
'gitWorktrees.empty': 'No worktrees',
'gitWorktrees.noMatches': 'No worktrees match',
'gitWorktrees.filter': 'Filter by path or branch',
'gitWorktrees.newSession': 'New worktree session…',
'gitWorktrees.main': 'main',
'gitWorktrees.current': 'this workspace',
'gitWorktrees.detached': 'detached HEAD',
'gitWorktrees.bare': 'bare',
'gitWorktrees.locked': 'locked',
'gitWorktrees.prunable': 'stale',
'gitWorktrees.clean': 'clean',
'gitWorktrees.dirty': (v) => `${v?.count ?? 0} change(s)`,
'gitWorktrees.statusError': 'status unavailable',
'gitWorktrees.remove': 'Remove',
'gitWorktrees.removeLabel': (v) => `Remove worktree ${v?.name ?? ''}`,
'gitWorktrees.removing': 'Removing…',
'gitWorktrees.cancel': 'Cancel',
'gitWorktrees.confirm':
'Remove this worktree? Its directory is deleted from disk; the branch is kept.',
'gitWorktrees.confirmStale':
'Remove this stale entry? Git stops tracking worktrees it can no longer find. Whatever is left in its directory stays; the bookkeeping git keeps for it does not.',
'gitWorktrees.confirmDetached':
'Remove this worktree? Its directory is deleted from disk. It is on a detached HEAD, so there is no branch to keep.',
'gitWorktrees.blockedDirty': (v) =>
`${v?.count ?? 0} uncommitted change(s) would be discarded.`,
'gitWorktrees.blockedInUse': (v) =>
`${v?.count ?? 0} running session(s) would lose their checkout.`,
'gitWorktrees.blockedInUseUnknown': (v) =>
`Could not read where ${v?.count ?? 0} running session(s) are working. Any working here would lose their checkout.`,
'gitWorktrees.blockedUnknown':
'The working tree could not be checked for uncommitted changes, and any there would be discarded.',
'gitWorktrees.blockedOperation': (v) =>
`An unfinished ${v?.operation ?? 'git'} would be lost.`,
'gitWorktrees.blockedUnmerged': (v) =>
`No branch keeps the commits here; ${String(v?.head ?? '').slice(0, 7)} would be left for git to collect.`,
'gitWorktrees.blockedLocked': (v) =>
v?.reason
? `This worktree is locked: ${v.reason}`
: 'This worktree is locked.',
'gitWorktrees.blockedRefused': 'Git refused to remove this worktree.',
'gitWorktrees.blockedWorkspaceHere': (v) =>
v?.name
? `The workspace ${v.name} lives in this worktree, so removing it would take the workspace too. Remove the workspace first.`
: 'A registered workspace lives in this worktree, so removing it would take the workspace too. Remove the workspace first.',
'gitWorktrees.blockedSubmodules':
'A submodule of this worktree keeps a repository of its own, and removing the worktree deletes that repository too.',
'gitWorktrees.blockedSubmodulesUnknown':
'Whether a submodule of this worktree keeps a repository of its own could not be checked. If one does, removing the worktree deletes it too.',
'gitWorktrees.refreshFailed':
'The list could not be refreshed, so it may be out of date.',
'gitWorktrees.removeAnyway': 'Remove anyway',
'gitWorktrees.removeFailed': 'Failed to remove the worktree',
'gitWorktrees.keptDirectory': (v) =>
`Git no longer tracks ${v?.name ?? ''}, but its directory is still on disk.`,
'gitWorktrees.refusedElsewhere': (v) =>
v?.reason
? `Removing ${v?.name ?? ''} was refused while you were looking elsewhere: ${v.reason}`
: `Removing ${v?.name ?? ''} was refused while you were looking elsewhere.`,
'githubPrs.title': 'Pull requests',
'githubPrs.subtitle': (v) => `${v?.count ?? 0} open`,
'githubPrs.loading': 'Loading pull requests…',
'githubPrs.empty': 'No open pull requests',
'githubPrs.unavailable': 'This workspace is not a git repository',
'githubPrs.error': 'Failed to load pull requests',
'githubPrs.cliUnavailable':
'The GitHub CLI (gh) is not installed on the daemon host.\nInstall it and run `gh auth login`, then try again.',
'githubPrs.reviewApproved': 'Approved',
'githubPrs.reviewChanges': 'Changes requested',
'githubPrs.reviewRequired': 'Review required',
'githubPrs.checksPassing': 'Checks passing',
'githubPrs.checksFailing': 'Checks failing',
'githubPrs.checksPending': 'Checks pending',
'githubPrs.open': (v) => `Open pull request #${v?.number ?? ''} on GitHub`,
'workspace.paneLabel': (v) => `Workspace: ${v?.name ?? ''}`,
'about.auth': 'Auth',
'about.baseUrl': 'Base URL',
'about.fastModel': 'Fast Model',
'about.memoryUsage': 'Memory Usage',
'about.model': 'Model',
'about.noProxy': 'no proxy',
'about.noSandbox': 'no sandbox',
'about.platform': 'OS',
'about.proxy': 'Proxy',
'about.runtime': 'Runtime',
'about.sandbox': 'Sandbox',
'about.sessionId': 'Session ID',
'about.title': 'Status',
'agent.back': 'Back',
'agent.builtInBadge': '(built-in)',
'agent.action.delete': 'Delete Agent',
'agent.action.edit': 'Edit Agent',
'agent.action.view': 'View Agent',
'agent.chooseAction': (v) => `Choose action for ${v?.name ?? ''}`,
'agent.chooseActionTitle': 'Choose Action',
'agent.colorLabel': 'Color: ',
'agent.colorUpdated': (v) => `Updated color for ${v?.name ?? ''}`,
'agent.create': 'Create a new subagent',
'agent.create.button': 'Create',
'agent.create.confirm': 'Confirm and Save',
'agent.create.desc': 'Create a new subagent',
'agent.create.descPlaceholder': 'What does this agent do?',
'agent.create.describeAgent': 'Describe requirements',
'agent.create.description': 'Description',
'agent.create.editAgain': 'Edit',
'agent.create.enterDescription': 'Enter Description',
'agent.create.enterName': 'Enter Subagent Name',
'agent.create.enterPrompt': 'Enter System Prompt',
'agent.create.generateFailed': (v) =>
`Failed to generate subagent: ${v?.error ?? 'Unknown error'}`,
'agent.create.generate': 'Generate',
'agent.create.generatedDescription': 'Description',
'agent.create.generatedSystemPrompt': 'System prompt',
'agent.create.generatingConfig': 'Generating subagent configuration...',
'agent.create.generatingPrompt': 'Generating...',
'agent.create.loading': 'Creating...',
'agent.create.location': 'Choose Location',
'agent.create.method': 'Choose Generation Method',
'agent.create.method.manual': 'Manual Creation',
'agent.create.method.qwen': 'Generate with Qwen Code',
'agent.create.method.qwen.recommended':
'Generate with Qwen Code (Recommended)',
'agent.create.method.qwen.desc':
'LLM generates the description and system prompt',
'agent.create.name': 'Name',
'agent.create.namePlaceholder': 'my-agent',
'agent.create.nameHelp': 'Enter a clear, unique name for this subagent.',
'agent.create.project': 'Project',
'agent.create.project.cli': 'Workspace',
'agent.create.project.desc': 'Create a project-level subagent',
'agent.create.prompt': 'System prompt',
'agent.create.promptPlaceholder': 'You are a specialized agent that...',
'agent.create.promptPlaceholder.cli':
'e.g., You are an expert code reviewer...',
'agent.create.promptHelp':
"Write the system prompt that defines this subagent's behavior. Be comprehensive for best results.",
'agent.create.preview': 'Preview',
'agent.create.qwenHint':
'Explain the responsibilities, usage scenarios, and important constraints, then generate each field separately.',
'agent.create.qwenPlaceholder':
'> e.g., Expert code reviewer that reviews code based on best practices...',
'agent.create.regenerate': 'Regenerate draft',
'agent.create.required': 'Name, description, and system prompt are required.',
'agent.create.tools': 'Allowed tools',
'agent.create.toolsHelp':
'Enter canonical tool names separated by commas or lines. MCP tools use mcp__server__tool; leave blank to inherit all tools.',
'agent.create.disallowedTools': 'Disallowed tools',
'agent.create.model': 'Model',
'agent.create.approvalMode': 'Approval mode',
'agent.create.maxTurns': 'Maximum execution turns',
'agent.create.maxTurnsHelp':
'Limits the model reasoning rounds for a single task. Execution stops at the limit; leave blank for no agent-specific limit.',
'agent.create.maxTurnsInvalid':
'Maximum execution turns must be a positive integer.',
'agent.create.mcpServers': 'MCP servers',
'agent.create.mcpServers.empty': 'No MCP servers are available.',
'agent.create.mcpServers.select': 'Select an MCP Server',
'agent.create.mcpServers.noneSelected': 'No MCP Servers selected.',
'agent.create.modelGenerate': 'Generate with model',
'agent.create.modelGenerate.description':
'Describe what you need, then generate and review the description and system prompt separately.',
'agent.create.color': 'Color',
'agent.create.jsonObjectHelp': 'Enter a JSON object, or leave blank.',
'agent.create.save': 'Save Agent',
'agent.create.scope': 'Category',
'agent.create.manualDescHelp':
'Describe when and how this subagent should be used.',
'agent.create.manualDescPlaceholder':
'e.g., Reviews code for best practices and potential bugs.',
'agent.create.tools.builtin': 'Built-in tools',
'agent.create.tools.empty': 'No tools are available.',
'agent.create.tools.mcp': 'MCP tools',
'agent.create.tools.type': 'Tool type',
'agent.create.tools.selectServer': 'Select an MCP Server',
'agent.create.tools.selectTool': 'Select a tool',
'agent.create.tools.noneSelected': 'No tools selected.',
'agent.create.tools.initializing': 'Initializing tool catalogs...',
'agent.create.tools.preheatFailed': 'ACP preheating did not complete.',
'agent.create.tools.loadFailed': 'Failed to load built-in tools.',
'agent.create.removeSelection': (v) => `Remove ${v?.name ?? ''}`,
'agent.create.toolsSelectHelp':
'Select the tools this subagent may use. Leave all unchecked to inherit all tools.',
'agent.create.toolsSelection': 'Select Tools',
'agent.create.tools.all': 'All Tools',
'agent.create.tools.allDefault': 'All Tools (Default)',
'agent.create.tools.allInfo': 'All tools selected, including MCP tools',
'agent.create.tools.allInfoFallback':
'All tools selected, including MCP tools',
'agent.create.tools.editLabel': '• Edit tools:',
'agent.create.tools.executionLabel': '• Execution tools:',
'agent.create.tools.none': '(none)',
'agent.create.tools.readEdit': 'Read & Edit Tools',
'agent.create.tools.readEditExecute': 'Read & Edit & Execution Tools',
'agent.create.tools.readOnlyLabel': '• Read-only tools:',
'agent.create.tools.readOnly': 'Read-only Tools',
'agent.create.tools.selected': 'Selected tools:',
'agent.create.user': 'User',
'agent.create.user.cli': 'Global',
'agent.create.user.desc': 'Create a user-level subagent',
'agent.create.useGenerated': 'Use this draft',
'agent.approval.inherit': 'Default',
'agent.approval.default': 'Default approval',
'agent.approval.plan': 'Plan only',
'agent.approval.auto-edit': 'Automatically approve edits',
'agent.approval.yolo': 'Automatically approve all actions',
'agent.approval.bubble': 'Bubble approval',
'agent.approval.desc.inherit': "Use the subagent's default approval rules.",
'agent.approval.desc.bubble':
'Forward tool approval requests to the parent session.',
'agent.createFirstHint':
"Use '/agents create' to create your first subagent.",
'agent.created': (v) => `Created ${v?.name ?? ''}`,
'agent.edit.save': 'Save changes',
'agent.updated': (v) => `Updated ${v?.name ?? ''}`,
'agent.turnsBadge': (v) => `${v?.count ?? 0} turns`,
'agent.delete': 'Delete',
'agent.delete.confirm': (v) =>
`Are you sure you want to delete "${v?.name ?? ''}"?`,
'agent.delete.loading': 'Deleting...',
'agent.delete.no': 'No',
'agent.delete.title': (v) => `Delete ${v?.name ?? ''}`,
'agent.delete.yes': 'Yes, delete',
'agent.deleted': (v) => `Deleted ${v?.name ?? ''}`,
'agent.edit': 'Edit',
'agent.edit.color': 'Edit Color',
'agent.edit.tools': 'Edit Tools',
'agent.editColorTitle': (v) => `Edit Color: ${v?.name ?? ''}`,
'agent.editTitle': (v) => `Edit ${v?.name ?? ''}`,
'agent.empty': 'No subagents found.',
'agent.noMatches': 'No matching subagents found.',
'agent.footer.back': 'Esc to go back',
'agent.footer.cliBack': 'Enter to select, ↑↓ to navigate, Esc to go back',
'agent.footer.cliSelect': 'Enter to select, ↑↓ to navigate, Esc to close',
'agent.footer.close': 'Esc to close',
'agent.footer.deleteConfirm': 'Enter to confirm, Esc to cancel',
'agent.footer.enterNext': 'Press Enter to continue, Esc to go back',
'agent.footer.generating': 'Esc to cancel',
'agent.footer.createLocation':
'Press Enter to continue, ↑↓ to navigate, Esc to cancel',
'agent.footer.createContinue':
'Press Enter to continue, ↑↓ to navigate, Esc to go back',
'agent.footer.final':
'Press Enter to save, e to save and edit, Esc to go back',
'agent.footer.nav': '↑↓ navigate · Enter select · Esc back',
'agent.footer.navBack': '↑↓ navigate · Enter select · Esc back',
'agent.footer.navSelect': '↑↓ navigate · Enter select · Esc close',
'agent.footer.viewerBack': 'Esc to go back',
'agent.filePathLabel': 'File Path: ',
'agent.label': 'Agent',
'agent.location': 'Location',
'agent.level.builtin': 'Built-in',
'agent.level.extension': 'Extension',
'agent.level.project': 'Project',
'agent.level.user': 'User',
'agent.level.filter': 'Filter by agent level',
'agent.manage': 'Manage',
'agent.manage.desc': 'Manage existing subagents',
'agent.modelLabel': 'Model: ',
'agent.overriddenBadge': '(overridden by project level agent)',
'agent.readonly': 'This agent is read-only.',
'agent.select': 'Select an agent.',
'agent.selectAction': 'Select an action',
'agent.descriptionLabel': 'Description:',
'agent.systemPromptLabel': 'System Prompt:',
'agent.level.label': 'Level',
'agent.step': (v) => `Step ${v?.n ?? ''}`,
'agent.tools': 'Tools',
'agent.toolsLabel': 'Tools: ',
'agent.detail.overview': 'Basic Information',
'agent.detail.tools': 'Tools',
'agent.detail.mcp': 'MCP',
'agent.detail.hooks': 'Hooks',
'agent.detail.systemPrompt': 'System Prompt',
'agent.toolsUpdated': (v) => `Updated tools for ${v?.name ?? ''}`,
'agent.usingCount': (v) => `Using: ${v?.count ?? 0} agents`,
'agent.view': 'View',
'agents.closed': 'Agents panel closed.',
'agents.title': 'Agents',
'subagent.result': 'Result',
'subagent.tools': (v) => `Tools (${v?.count ?? 0})`,
'subagent.toolsCount': (v) => `${v?.count ?? 0} tools`,
'subagent.toggleStream': 'Toggle agent stream details',
'subagent.creating': 'Creating…',
'subagent.pending': 'pending',
'subagent.running': 'running',
'subagent.background': 'background task',
'subagent.completed': 'completed',
'subagent.failed': 'failed',
'subagent.cancelled': 'cancelled',
'subagent.paused': 'paused',
'subagent.detailsLoading': 'Loading agent details…',
'subagent.detailsLoadFailed': 'Failed to load agent details.',
'agentType.general-purpose': 'General-purpose',
'agentType.explore': 'Explore',
'agentType.statusline-setup': 'Status Line Setup',
'agentType.review-agent': 'Review Agent',
'agentType.test-engineer': 'Test Engineer',
'agentType.fork': 'Fork',
'timeline.parallelAgents': 'Parallel agents',
'timeline.thinking': 'Thinking',
'timeline.assistantUpdate': 'Assistant update',
'timeline.toolCalls': (v) =>
`${v?.count ?? 0} tool call${v?.count === 1 ? '' : 's'}`,
'timeline.planUpdate': 'Plan update',
'timeline.statusUpdate': 'Status update',
'timeline.userTurn': 'User turn',
'timeline.planDetail': 'plan update',
'timeline.parallelAgentsDetail': (v) =>
`${v?.count ?? 0} parallel agent${v?.count === 1 ? '' : 's'}`,
'timeline.noActivity': 'No activity',
'timeline.sessionTimeline': 'Session timeline',
'timeline.turnPrefix': (v) => `Turn ${v?.index ?? 0}`,
'timeline.currentTurn': 'Current turn',
'timeline.kind.thought': 'thinking',
'timeline.kind.commentary': 'assistant update',
'timeline.kind.tool': 'tool calls',
'timeline.kind.agents': 'parallel agents',
'timeline.kind.plan': 'plan update',
'timeline.kind.status': 'status update',
'timeline.kind.none': 'turn',
'common.copy': 'Copy',
'common.download': 'Download',
'common.downloading': 'Downloading…',
'common.downloadFailed': (v) => `Download failed: ${v?.message ?? ''}`,
'common.open': 'Open',
'common.openFailed': (v) => `Could not open link: ${v?.message ?? ''}`,
'excel.worksheet': 'Worksheet',
'excel.row': 'Row',
'excel.truncated': (v) =>
`Preview limited to ${v?.cells} cells per worksheet. Download the original for all content.`,
'excel.previousWorksheets': 'Previous worksheets',
'excel.nextWorksheets': 'Next worksheets',
'excel.empty': 'This worksheet is empty.',
'excel.notCalculated': 'Not calculated',
'excel.tooLarge':
'Excel preview supports files up to 10 MiB. Download the original to open it.',
'excel.invalid':
'Unable to preview this workbook. It may be damaged, password protected, too complex, or unsupported by this browser. You can download the original.',
'excel.timeout':
'This workbook took too long to preview. Download the original to open it.',
'artifact.openLink': 'Open link',
'artifact.longDocument': 'File is large. Source is shown by default.',
'artifact.renderFullPreview': 'Render full preview',
'artifact.registrationFailed': (v) =>
`Could not add exported artifact: ${v?.message ?? ''}`,
'artifact.previewFailed': (v) =>
`Could not load preview: ${v?.message ?? ''}`,
'artifact.showSource': 'Show source',
'common.na': 'N/A',
'common.server': 'Server',
'common.agent': 'Agent',
'common.auto': 'auto',
'common.runtime': 'Runtime',
'common.failedToLoad': 'Failed to load',
'auth.notSet': '(not set)',
'auth.apiKeyPlaceholder': 'sk-...',
'auth.modelsPlaceholder': 'model-id-1, model-id-2',
'model.usingModel': (v) =>
`Using ${v?.isRuntime ? 'runtime ' : ''}model: ${v?.modelId ?? ''}`,
'mermaid.label': 'mermaid',
'mermaid.errorLabel': 'mermaid (error)',
'user.uploadedImage': (v) => `User uploaded image ${v?.index ?? 1}`,
'resume.failedToLoad': 'Failed to load sessions',
'toast.dismiss': 'Dismiss notification',
'toast.dismissShort': 'Dismiss',
'insight.ready': 'Insight report generated successfully!',
'request.cancelled': 'Request cancelled.',
'visionBridge.model': 'vision model',
'visionBridge.skipped': (v) =>
`Vision bridge cancelled.${v?.egressOccurred === 1 ? ` Your image and prompt/context were sent to ${v?.target ?? ''}.` : ''}`,
'visionBridge.failed': (v) =>
v?.egressOccurred === 1
? `Vision bridge (${v?.modelName ?? ''}) failed: the vision model request failed. Your image and prompt/context were sent to ${v?.target ?? ''}. The image was not interpreted.`
: `Vision bridge (${v?.target ?? ''}) failed: the vision bridge could not run. The image was not interpreted.`,
'visionBridge.ok': (v) =>
`Converted ${v?.convertedCount ?? 0} image(s)${Number(v?.omittedCount ?? 0) > 0 ? ` (${v?.omittedCount ?? 0} image(s) omitted)` : ''} to text via ${v?.target ?? ''}.${v?.egressOccurred === 1 ? ' Your image and prompt/context were sent to that model.' : ''}`,
'approval.goal.title': 'Confirm session goal',
'approval.goal.overview': 'Goal overview',
'approval.goal.full': 'Full content',
'approval.goal.outcome': 'Outcome',
'approval.goal.doneWhen': 'Completion criteria',
'approval.goal.mustNot': 'Constraints',
'approval.goal.budget': 'Budget',
'approval.goal.onBlock': 'When blocked',
'approval.goal.context': 'Context',
'approval.goal.confirm': 'Set goal and continue',
'approval.goal.reject': 'Not now',
'approval.goal.hint':
'Setting this goal continues execution and checks progress after each turn. Blockers will be reported.',
'approval.goal.pending': 'Submitting…',
'approval.goal.failed': 'Could not submit your choice. Please try again.',
'approval.execQuestion': (v) => `Allow execution of: '${v?.tool ?? ''}'?`,
'approval.changeQuestion': 'Apply this change?',
'approval.launchAgentQuestion': 'Launch this agent?',
'approval.explain': 'Explain',
'approval.explanation': 'Command explanation',
'approval.explaining': 'Explaining…',
'approval.explanationThinking': 'Thinking…',
'approval.explanationFailed': 'Explanation failed',
'approval.reExplain': 'Explain again',
'approval.option.allowOnce': 'Yes, allow once',
'approval.option.allowOnceAndSwitchToDefault':
'Allow once and switch to Default mode',
'approval.option.restorePrevious': 'Yes, restore previous mode',
'approval.option.rejectOnce': 'Reject',
'approval.option.allowAllEdits': 'Allow All Edits',
'approval.option.allowAlwaysProject': 'Always allow in this project',
'approval.option.allowAlwaysUser': 'Always allow for this user',
'approval.option.allowAlwaysServer': 'Always allow for this server',
'approval.option.allowAlwaysTool': 'Always allow for this tool',
'assistant.branch': 'Branch',
'assistant.copy': 'Copy',
'assistant.selectionCopy': 'Copy selection',
'assistant.copyPlainText': 'Copy plain text',
'assistant.copyMarkdown': 'Copy Markdown',
'assistant.dissatisfied': 'Not satisfied',
'assistant.satisfied': 'Satisfied',
// A workspace agent's reply in a chat session. These render in exported
// transcripts too, so they live here rather than in the collab dictionary.
'agentMessage.status.failed': 'Failed',
'agentMessage.status.cancelled': 'Stopped',
'agentMessage.status.offline': 'Runtime offline',
'agentMessage.tokens': (v) => `${v?.count ?? 0} tokens`,
'agentMessage.steps': 'Steps',
'agentMessage.noAction': (v) => `${v?.name ?? ''} had nothing to do`,
'agentMessage.step.running': 'Running',
'agentMessage.step.completed': 'Done',
'agentMessage.step.failed': 'Failed',
'agentMessage.step.stopped': 'Stopped',
'at.category.extensions': 'Extensions',
'at.category.extensions.description': 'Reference active extensions',
'at.category.files': 'Files',
'at.category.files.description': 'Reference workspace files',
'at.files.upload': 'Upload file',
'at.files.upload.description': 'Upload a file into this folder',
'composer.upload.pending': 'Waiting',
'composer.upload.uploading': 'Uploading',
'composer.upload.done': 'Uploaded',
'composer.upload.error': 'Failed',
'composer.upload.error.noDaemon': 'No daemon connection',
'composer.upload.error.tooLarge': (v) =>
`File exceeds the ${v?.limit ?? ''} upload limit`,
'composer.upload.error.tooManyFiles': (v) =>
`${v?.count ?? 0} more files were not added (limit per batch)`,
'composer.upload.cancel': 'Cancel upload',
'composer.upload.dismiss': 'Dismiss',
'composer.upload.renamed': 'Saved as',
'composer.upload.drop': 'Drop files',
'composer.dropChoice.title': (v) =>
Number(v?.count) === 1
? 'Add dropped file'
: `Add ${v?.count ?? 0} dropped files`,
'composer.dropChoice.description':
'Attach the files to this message for the agent to read, or upload them to the workspace and insert @ references.',
'composer.dropChoice.cancel': 'Cancel',
'composer.dropChoice.upload': 'Upload to workspace',
'composer.dropChoice.reference': 'Attach to message',
'composer.dropChoice.moreFiles': (v) => `and ${v?.count ?? 0} more files`,
'composerAdd.trigger': 'Add to message',
'composerMobile.expand': 'Expand editor',
'composerMobile.hideKeyboard': 'Hide keyboard',
'composerMobile.done': 'Done',
'composerMobile.photos': 'Photos',
'composerMobile.camera': 'Take photo',
'composerMobile.files': 'Attach files',
'composerMobile.commands': 'All commands',
'composerMobile.searchCommands': 'Search commands',
'composerMobile.history': 'Input history',
'composerMobile.previousInput': 'Previous input',
'composerMobile.nextInput': 'Next input',
'composerMobile.stop': 'Stop',
'composerMobile.attachments': (v) =>
`Attached files/images: ${v?.count ?? 0}`,
'composerAdd.emptyState': 'No add actions are available here',
'composerAdd.noResults': 'No results',
'composerAdd.loadError': 'Failed to load results',
'composerAdd.unavailable': 'Unavailable',
'composerAdd.file.label': 'Add file',
'composerAdd.file.attachDisabled': 'Message attachments are unavailable',
'composerAdd.file.uploadDisabled': 'Workspace upload is unavailable',
'composerAdd.referenceFile.label': 'Reference file',
'composerAdd.referenceFile.searchPlaceholder': 'Search workspace files',
'composerAdd.extensions.label': 'Extensions',
'composerAdd.extensions.empty': 'No extensions are enabled',
'composerAdd.mcp.label': 'MCP',
'composerAdd.mcp.empty': 'No MCP servers are available',
'composerAdd.skills.label': 'Skills',
'composerAdd.plan.label': 'Plan mode',
'composerAdd.plan.description': 'Plan first, run after you approve',
'composerAdd.plan.busy': 'Switching mode',
'composerAdd.btw.label': 'Ask a side question',
'composerAdd.btw.description': 'Keep the main task running',
'composerAdd.btw.textOnly': 'Remove attachments first',
'at.category.mcpResources': 'MCP resources',
'at.category.mcpResources.description': 'Reference MCP server resources',
'at.menu': 'Reference menu',
'common.back': 'back',
'common.all': 'All',
'common.add': 'add',
'common.cancel': 'cancel',
'common.close': 'close',
'common.fullscreen': 'Fullscreen',
'common.exitFullscreen': 'Exit fullscreen',
'common.continue': 'continue',
'common.current': 'current',
'common.disabled': 'disabled',
'common.enabled': 'enabled',
'common.enterSelect': 'Enter to select',
'common.invalid': 'invalid',
'common.loading': 'Loading...',
'common.retry': 'Try again',
'session.recovery.interrupted_prompt':
'The previous request was interrupted before the response completed.',
'session.recovery.interrupted_turn':
'The previous task was interrupted. Some tool results were not saved.',
'session.recovery.degraded_history':
'Conversation history is incomplete. The interrupted task cannot be continued.',
'session.recovery.continue': 'Continue execution',
'session.recovery.continuing': 'Continuing…',
'session.recovery.failed': 'Could not continue the conversation.',
'session.archived': 'This conversation is archived',
'session.archivedDescription':
'Unarchive it before opening the conversation.',
'session.capabilitiesFailed':
'The daemon capabilities could not be loaded. Try again before opening this conversation.',
'session.contextConflict':
'A standalone or Live conversation link cannot include a workspace target.',
'session.loadFailed': 'Failed to load conversation',
'session.notFound': 'Conversation not found',
'session.notFoundDescription':
'This standalone conversation no longer exists.',
'session.resolving': 'Opening conversation...',
'session.standaloneUnavailable': 'Standalone conversations are unavailable',
'session.standaloneUpgradeRequired':
'Upgrade the daemon to open standalone conversations.',
'session.stillCreating':
'The conversation is still being created. Try checking again.',
'session.recoveryPending':
'Creation may have succeeded, but the result could not be confirmed. Sending is paused to avoid creating a duplicate conversation.',
'session.recoveryChecking': 'Checking the reserved conversation ID...',
'session.recoveryStillCreating':
'The conversation is still being created. Check again in a moment.',
'session.recoveryAbsent':
'No conversation exists for the reserved ID. You can explicitly start a fresh conversation.',
'session.recoveryUnknown':
'The creation result is still unknown. Check again before starting another conversation.',
'session.recoveryArchived':
'The recovered conversation is archived. Unarchive it before opening.',
'session.recoveryCheckFailed': 'Failed to check conversation creation',
'session.recoveryBlocksAction':
'Resolve the pending standalone conversation state before continuing.',
'session.checkStatus': 'Check status',
'session.retryCreation': 'Start a fresh conversation',
'session.writerBlocked':
'Another Qwen process or an unresolved writer lock may be blocking this conversation. Close it in other processes and try again. If it still fails, check local daemon diagnostics before recovery.',
'session.directoryRecreated':
'The transcript was recovered, but files from the previous private directory were not available.',
'session.directoryMissing':
"This conversation's private working directory is missing. Repair it before sending another prompt.",
'session.directoryCompromised':
'This private working directory is unsafe and cannot be repaired automatically. Export the transcript, then delete the conversation.',
'session.repair': 'Repair directory',
'session.repairing': 'Repairing...',
'session.repairFailed': 'Failed to repair the private working directory',
'session.repairSucceeded': 'The private working directory was repaired.',
'session.unarchive': 'Unarchive',
'session.unarchiveFailed': 'Failed to unarchive this conversation.',
'session.workspaceActionUnavailable':
'This action is available only in project conversations.',
'common.save': 'save',
'common.navigate': '↑↓ to navigate',
'common.next': 'next',
'common.noResults': 'No results',
'common.previous': 'previous',
'common.expand': 'Expand',
'common.collapse': 'Collapse',
'common.refresh': 'Refresh',
'common.search': 'Search',
'common.valid': 'valid',
'common.clients': (v) => `${v?.count ?? 0} clients`,
'agent.count': (v) => `${v?.count ?? 0} agents`,
'askUser.submit': 'Submit',
'askUser.submitting': 'Submitting...',
'askUser.submitFailed': 'Failed to submit answer',
'askUser.submitOptionUnavailable': 'Submit option is unavailable',
'askUser.ignore': 'Ignore',
'askUser.multiHint': 'multiple choice',
'askUser.progress': (v) => `${v?.current ?? 0}/${v?.total ?? 0} questions`,
'askUser.selectAnswer': 'Select an answer',
'askUser.typePlaceholder': 'Type something...',
'askUser.shortcuts.previous': '← previous',
'askUser.shortcuts.optionsSingle': '↑↓ select · Enter submit',
'askUser.shortcuts.optionsNext': '↑↓ select · Enter next',
'askUser.shortcuts.optionsFinal': '↑↓ select · Enter submit',
'askUser.shortcuts.multiSingle':
'↑↓ move · Space select/deselect · Enter select & submit',
'askUser.shortcuts.multiNext':
'↑↓ move · Space select/deselect · Enter select & next',
'askUser.shortcuts.multiFinal':
'↑↓ move · Space select/deselect · Enter select & submit',
'askUser.shortcuts.customTrigger': '↑↓ select · Enter edit',
'askUser.shortcuts.customTriggerMulti': '↑↓ move · Enter edit',
'askUser.shortcuts.inputEmpty': 'Type an answer · Esc stop editing',
'askUser.shortcuts.inputSingle': 'Enter submit · Esc stop editing',
'askUser.shortcuts.inputNext': 'Enter next · Esc stop editing',
'askUser.shortcuts.inputFinal': 'Enter submit · Esc stop editing',
'copy.failedFallback': 'Failed to copy to the clipboard',
'copy.inlineLatexMissing':
'No matching inline LaTeX expression found in the last AI output.',
'copy.latexMissing': 'No matching LaTeX block found in the last AI output.',
'copy.noOutput': 'No output in history',
'copy.noText': 'Last AI output contains no text to copy.',
'copy.codeMissing': 'No matching code block found in the last AI output.',
'copy.outputCopied': 'Last output copied to the clipboard',
'copy.toClipboard': (v) =>
`${v?.label ?? 'Selection'} copied to the clipboard`,
'code.copy': 'Copy',
'code.copied': 'Copied!',
'echartsChart.noData': 'No data',
'echartsChart.tableNotice': (v) => {
const omittedRows = Number(v?.omittedRows ?? 0);
const omittedColumns = Number(v?.omittedColumns ?? 0);
if (omittedRows > 0 && omittedColumns > 0) {
return `Showing ${v?.visibleRows ?? 0} of ${v?.totalRows ?? 0} rows and ${v?.visibleColumns ?? 0} of ${v?.totalColumns ?? 0} columns`;
}
if (omittedColumns > 0) {
return `Showing ${v?.visibleColumns ?? 0} of ${v?.totalColumns ?? 0} columns`;
}
return `Showing ${v?.visibleRows ?? 0} of ${v?.totalRows ?? 0} rows`;
},
'echartsChart.rendering': 'Rendering chart',
'echartsChart.renderFailed': 'Chart render failed.',
'echartsChart.viewMode': 'View mode',
'echartsChart.showChart': 'Show chart',
'echartsChart.showData': 'Show data',
'echartsChart.chart': 'Chart',
'echartsChart.data': 'Data',
'markdownTable.blank': '(blank)',
'markdownTable.column': (v) => `Column ${v?.index ?? ''}`,
'markdownTable.rows': (v) => {
const count = Number(v?.count ?? 0);
return `${count} row${count === 1 ? '' : 's'}`;
},
'markdownTable.rowsFiltered': (v) =>
`${v?.visible ?? 0}/${v?.total ?? 0} rows`,
'markdownTable.hint': 'Click headers to sort, open filters from ▾.',
'markdownTable.filtersActive': (v) => {
const count = Number(v?.count ?? 0);
return `${count} filter${count === 1 ? '' : 's'}`;
},
'markdownTable.selection.selected': 'Selected',
'markdownTable.selection.nonEmpty': 'Non-empty',
'markdownTable.selection.numeric': 'Numeric',
'markdownTable.selection.sum': 'Sum',
'markdownTable.selection.average': 'Average',
'markdownTable.selection.min': 'Min',
'markdownTable.selection.max': 'Max',
'markdownTable.copyTsv': 'Copy TSV',
'markdownTable.copyTsvHint': 'Copy as TSV for pasting into spreadsheet apps',
'markdownTable.copyVisible': 'Copy table',
'markdownTable.customColumns': 'Custom columns',
'markdownTable.customColumns.tableSection': 'Columns shown in the table',
'markdownTable.customColumns.detailSection': 'Fields shown in expanded rows',
'markdownTable.customColumns.toggleAllTable': 'Toggle all table columns',
'markdownTable.customColumns.toggleAllDetails':
'Toggle all expanded-row fields',
'markdownTable.customColumns.reset': 'Reset',
'markdownTable.customColumns.noDetails': 'No expanded-row fields selected.',
'markdownTable.freezeFirstColumn': 'Freeze first column',
'markdownTable.unfreezeFirstColumn': 'Unfreeze first column',
'markdownTable.densityLabel': 'Table density',
'markdownTable.densityCurrent': (v) => `${v?.density ?? ''} density`.trim(),
'markdownTable.density': (v) => `Density: ${v?.density ?? ''}`,
'markdownTable.density.standard': 'Standard',
'markdownTable.density.compact': 'Compact',
'markdownTable.density.comfortable': 'Comfortable',
'markdownTable.expandLongText': 'Expand text',
'markdownTable.collapseLongText': 'Collapse text',
'markdownTable.emptyValue': '(blank)',
'markdownTable.hideColumn': 'Hide column',
'markdownTable.showHiddenColumns': (v) => {
const count = Number(v?.count ?? 0);
return `Show ${count} hidden column${count === 1 ? '' : 's'}`;
},
'markdownTable.moveColumn': (v) => `Move ${v?.column ?? ''}`,
'markdownTable.resizeColumn': (v) => `Resize ${v?.column ?? ''}`,
'markdownTable.rowDetails': 'Details',
'markdownTable.rowDetailsAria': (v) =>
`View details for row ${v?.index ?? ''}`,
'markdownTable.closeRowDetailsAria': (v) =>
`Hide details for row ${v?.index ?? ''}`,
'markdownTable.detailsHeader': 'Row details',
'markdownTable.cellDialogTitle': 'Current field value',
'markdownTable.copyCell': 'Copy',
'markdownTable.close': 'Close',
'markdownTable.actions': 'Actions',
'markdownTable.sortByColumn': (v) => `Sort by ${v?.column ?? ''}`,
'markdownTable.sortByColumnAsc': (v) =>
`Sort by ${v?.column ?? ''}, ascending`,
'markdownTable.sortByColumnDesc': (v) =>
`Sort by ${v?.column ?? ''}, descending`,
'markdownTable.filterColumn': (v) => `Filter ${v?.column ?? ''}`,
'markdownTable.empty': 'This table has no data.',
'markdownTable.emptyFiltered': 'No rows match the filters.',
'markdownTable.sort.asc': 'Sort ascending',
'markdownTable.sort.desc': 'Sort descending',
'markdownTable.sort.clear': 'Clear sort',
'markdownTable.filter.searchPlaceholder': 'Search filter values',
'markdownTable.filter.searchAria': (v) => `Search ${v?.column ?? ''}`,
'markdownTable.filter.selectVisible': 'Select current results',
'markdownTable.filter.optionLimit': (v) =>
`Showing first ${v?.count ?? 0} items. Search to narrow results.`,
'markdownTable.filter.noOptions': 'No matches',
'markdownTable.filter.custom': 'Custom filter',
'markdownTable.filter.numberAria': (v) =>
`Number filter for ${v?.column ?? ''}`,
'markdownTable.filter.textAria': (v) => `Text filter for ${v?.column ?? ''}`,
'markdownTable.filter.numberPlaceholder': 'Value',
'markdownTable.filter.toPlaceholder': 'To',
'markdownTable.filter.textPlaceholder': 'Enter filter condition',
'markdownTable.filter.reset': 'Reset',
'markdownTable.filter.cancel': 'Cancel',
'markdownTable.filter.confirm': 'Confirm',
'markdownTable.filter.text.contains': 'Contains',
'markdownTable.filter.text.equals': 'Equals',
'markdownTable.filter.text.notEquals': 'Does not equal',
'markdownTable.filter.text.startsWith': 'Starts with',
'markdownTable.filter.text.endsWith': 'Ends with',
'markdownTable.filter.number.gt': 'Greater than',
'markdownTable.filter.number.gte': 'Greater than or equal to',
'markdownTable.filter.number.lt': 'Less than',
'markdownTable.filter.number.lte': 'Less than or equal to',
'markdownTable.filter.number.between': 'Between',
'mermaid.rendering': 'Rendering diagram...',
'mermaid.viewCode': '</>',
'mermaid.viewDiagram': '⊞',
'mermaid.zoomIn': '+',
'mermaid.zoomOut': '−',
'mermaid.zoomReset': '↺',
'contextUsage.active': 'active',
'contextUsage.autocompactBuffer': 'Autocompact buffer',
'contextUsage.bodyLoaded': 'body loaded',
'contextUsage.builtinTools': 'Built-in tools',
'contextUsage.contextWindow': 'Context window',
'contextUsage.detailHint': 'Run /context detail for per-item breakdown.',
'contextUsage.estimatedOverhead': 'Estimated base overhead',
'contextUsage.estimatedUsage': 'Estimated usage, including the conversation',
'contextUsage.usageEstimatedWithConversation':
'No provider usage yet. The estimates below include the conversation.',
'contextUsage.estimatedUntilProviderUsage':
'Token usage is estimated until provider usage is received.',
'contextUsage.free': 'Free',
'contextUsage.memoryFiles': 'Memory files',
'contextUsage.messages': 'Messages',
'contextUsage.startupContext': 'Startup context',
'contextUsage.unattributed': 'Unattributed',
'contextUsage.cachedPrefix': 'Cached prefix',
'contextUsage.mcpTools': 'MCP tools',
'contextUsage.model': 'Model',
'contextUsage.noSession':
'No active session yet. Send your first message before viewing context usage.',
'contextUsage.usageUnavailable':
'Current context usage is unavailable. The estimates below cover base overhead only, excluding conversation messages.',
'contextUsage.overLimit':
'Context exceeds limit! Use /compress or /clear to reduce.',
'contextUsage.skills': 'Skills',
'contextUsage.systemPrompt': 'System prompt',
'contextUsage.title': 'Context Usage',
'contextUsage.tokens': 'tokens',
'contextUsage.used': 'Used',
'contextUsage.accessibleUsage': (v) =>
`${v?.used} of ${v?.total} tokens used`,
'contextUsage.viewDetails': 'View details',
'contextUsage.viewInConversation':
'Click to view the breakdown in the conversation.',
'daemon.title': 'Daemon Status',
'daemon.connection.title': 'Connections',
'daemon.connection.target': 'Current target',
'daemon.connection.state': 'Connection state',
'daemon.connection.address': 'Daemon address',
'daemon.connection.token': 'Bearer token (optional)',
'daemon.connection.connect': 'Connect',
'daemon.connection.add': 'Add connection',
'daemon.connection.saved': 'Connected computers',
'daemon.connection.forget': (v) => `Forget ${v?.address}`,
'workspaceHost.local': 'Local',
'workspaceHost.remote': 'Remote',
'workspaceHost.openHost': (v) => `Open ${v?.host ?? ''}`,
'workspaceHost.statusOffline': 'offline',
'workspaceHost.statusUnauthorized': 'unauthorized',
'workspaceHost.focused': 'connected',
'workspaceHost.focusedHint':
'This page is connected to this daemon — the chat runs against it.',
'workspaceHost.offlineHint':
'This host could not be reached; showing its last known projects.',
'workspaceHost.unauthorizedHint':
'The saved credential was rejected. Open this host to sign in again.',
'daemon.connection.invalid': 'Enter a valid HTTP or HTTPS origin.',
'daemon.connection.notReady':
'The daemon did not accept the connection; the stored credential was left unchanged.',
'daemon.connection.authFailed':
'The daemon rejected that token; the stored credential was left unchanged.',
'daemon.connection.reloadUnavailable':
'Browser storage is unavailable, so the new token could not be applied to this connection.',
'daemon.connection.switchUnavailable':
'Browser storage is unavailable, so the token could not be carried to that daemon.',
'daemon.connection.status.idle': 'Idle',
'daemon.connection.status.connecting': 'Connecting',
'daemon.connection.status.adding': 'Adding',
'daemon.connection.status.connected': 'Connected',
'daemon.connection.status.error': 'Error',
'daemon.details.loading': 'Loading diagnostics...',
'daemon.details.failed': 'Failed to load diagnostics.',
'daemon.refresh': 'Refresh',
'daemon.loading': 'Loading daemon status...',
'daemon.loadFailed': 'Failed to load daemon status',
'daemon.updatedAt': (v) => `Updated ${v?.time ?? ''}`,
'daemon.none': 'none',
'daemon.level.ok': 'OK',
'daemon.level.warning': 'Warning',
'daemon.level.error': 'Error',
'daemon.level.unavailable': 'Unavailable',
'daemon.issues.title': 'Issues',
'daemon.overview.title': 'Daemon',
'daemon.overview.version': 'Version',
'daemon.overview.pid': 'PID',
'daemon.overview.mode': 'Mode',
'daemon.overview.uptime': 'Uptime',
'daemon.overview.workspace': 'Workspace',
'daemon.runtime.title': 'Runtime',
'daemon.runtime.activeSessions': 'Active sessions',
'daemon.runtime.activePrompts': 'Active prompts',
'daemon.runtime.idle': 'Idle for',
'daemon.runtime.noActivity': 'no activity yet',
'daemon.runtime.pendingPermissions': 'Pending permissions',
'daemon.runtime.permissionPolicy': 'Permission policy',
'daemon.runtime.channel': 'ACP channel',
'daemon.runtime.channelLive': 'live',
'daemon.runtime.channelDown': 'down',
'daemon.runtime.startingUp': 'Runtime is starting...',
'daemon.runtime.startFailed': 'Runtime failed to start',
'daemon.runtime.channelWorker': 'Channel worker',
'daemon.runtime.channelWorkerRestarts': 'Worker restarts',
'daemon.runtime.memory': 'Memory (RSS / heap)',
'daemon.transport.title': 'Transport',
'daemon.transport.restSse': 'REST SSE streams',
'daemon.transport.acpDisabled': 'ACP transport disabled',
'daemon.transport.acpConnections': 'ACP connections',
'daemon.transport.acpStreams': 'ACP streams (session/SSE/WS)',
'daemon.transport.pendingRequests': 'Pending client requests',
'daemon.transport.rateLimitRejected': 'Rate-limit rejects',
'daemon.security.title': 'Security',
'daemon.security.token': 'Bearer token',
'daemon.security.requireAuth': 'Require auth',
'daemon.security.loopback': 'Loopback bind',
'daemon.security.allowOrigin': 'Allowed origins',
'daemon.security.shell': 'Session shell commands',
'daemon.security.configured': 'configured',
'daemon.security.notConfigured': 'not configured',
'daemon.limits.title': 'Limits',
'daemon.limits.unlimited': 'unlimited',
'daemon.limits.maxSessions': 'Max sessions',
'daemon.limits.maxPendingPrompts': 'Max pending prompts / session',
'daemon.limits.maxConnections': 'Max listener connections',
'daemon.limits.eventRing': 'Event ring size',
'daemon.limits.promptDeadline': 'Prompt deadline',
'daemon.limits.sessionIdle': 'Session idle timeout',
'daemon.capabilities.title': 'Capabilities',
'daemon.capabilities.titleCount': (v) => `Capabilities (${v?.count ?? 0})`,
'daemon.full.sessions.title': 'Sessions',
'daemon.full.sessions.empty': 'No active sessions',
'daemon.full.session.pendingPrompts': (v) =>
`${v?.count ?? 0} pending prompts`,
'daemon.full.session.pendingPermissions': (v) =>
`${v?.count ?? 0} pending permissions`,
'daemon.full.session.prompting': 'prompting',
'daemon.full.workspace.title': 'Workspace Diagnostics',
'daemon.full.workspace.empty': 'No workspace diagnostics reported',
'daemon.full.auth.title': 'Auth',
'daemon.full.auth.providers': 'Device-flow providers',
'daemon.full.auth.pending': 'Pending device flows',
'daemon.full.acp.title': 'ACP connections',
'daemon.tab.overview': 'Overview',
'daemon.tab.usage': 'Usage',
'daemon.tab.metrics': 'Metrics',
'daemon.tab.diagnostics': 'Diagnostics',
'daemon.charts.title': 'Metrics',
'daemon.charts.empty':
'Collecting metrics… charts appear after the first sample.',
'daemon.charts.concurrency': 'Concurrency',
'daemon.charts.activePrompts': 'Active tasks',
'daemon.charts.activeSessions': 'Sessions',
'daemon.charts.requests': 'Requests',
'daemon.charts.reqTotal': 'Total',
'daemon.charts.reqErrors': 'Errors',
'daemon.charts.apiLatency': 'API latency',
'daemon.charts.promptLatency': 'Prompt latency',
'daemon.charts.queueWait': 'Queue wait',
'daemon.charts.promptDuration': 'Duration',
'daemon.charts.eventLoop': 'Event-loop lag',
'daemon.charts.eventLoopLag': 'Lag p99',
'daemon.charts.queuedPrompts': 'Queued',
'daemon.charts.reqRejected': 'Rejected',
'daemon.charts.llmLatency': 'LLM API latency',
'daemon.charts.apiHealth': 'Model API health',
'daemon.charts.apiErrors': 'API errors',
'daemon.charts.apiRetries': 'Retries',
'daemon.charts.cpu': 'CPU',
'daemon.charts.pipe': 'IPC pipe',
'daemon.charts.pipeIn': 'In',
'daemon.charts.pipeOut': 'Out',
'daemon.charts.connections': 'Connections',
'daemon.charts.cpuDaemon': 'Daemon',
'daemon.charts.cpuChild': 'Child',
'daemon.charts.rssDaemon': 'Daemon RSS',
'daemon.charts.rssChild': 'Child RSS',
'daemon.charts.memory': 'Memory',
'daemon.charts.heap': 'Heap',
'daemon.charts.tokens': 'Token burn',
'daemon.charts.tokensIn': 'Input',
'daemon.charts.tokensOut': 'Output',
'daemon.charts.peak': 'peak',
'daemon.charts.concurrency.help':
'Live load at each sample: prompts running now, prompts queued (accepted but not yet dispatched), and active sessions. Queued rising above active is backpressure.',
'daemon.charts.requests.help':
'Client↔daemon HTTP traffic per window — NOT model calls. Total requests, those returning 4xx/5xx, and those the rate limiter rejected.',
'daemon.charts.apiLatency.help':
"Client↔daemon HTTP request duration (p50/p95) — how fast the daemon answers, not the model. Compare with LLM API latency to separate 'we are slow' from 'the model is slow'.",
'daemon.charts.llmLatency.help':
'Per-round model API round-trip (daemon→model→daemon), p50/p95. Model-side latency, distinct from the HTTP API latency above.',
'daemon.charts.apiHealth.help':
'Provider-side LLM failures. Each failed attempt = 1 error; each automatic backoff = 1 retry. Transient 429/5xx are usually absorbed by retries (errors ≈ retries); errors climbing above retries means calls are failing outright.',
'daemon.charts.promptLatency.help':
'Per prompt (task): p95 time waiting in the per-session queue before dispatch, and p95 end-to-end run time. Rising queue wait signals backpressure.',
'daemon.charts.eventLoop.help':
'Daemon event-loop lag p99 per window — the CPU-saturation / blocking signal. High lag means the daemon is starved and everything slows.',
'daemon.charts.cpu.help':
'CPU utilization (% of all cores) at each sample: the daemon and the ACP child (where LLM/tool work runs). Child at 0% means no child is running.',
'daemon.charts.memory.help':
'Resident memory at each sample: daemon RSS, daemon V8 heap, and ACP child RSS. Steady growth over time hints at a leak.',
'daemon.charts.pipe.help':
'Bytes over the stdio pipe to/from the ACP child per window. Sustained high volume points to chatty framing between daemon and child.',
'daemon.charts.connections.help':
'Live client transport connections at each sample: REST/SSE streams, ACP WebSocket streams, and ACP connections.',
'daemon.charts.tokens.help':
'Input (prompt) and output (completion) tokens attributed to model turns per window — model spend over time.',
'daemon.usage.today': 'Today',
'daemon.usage.period7d': '7D',
'daemon.usage.period30d': '30D',
'daemon.usage.rangeWeek': 'Last 7 days',
'daemon.usage.rangeMonth': 'Last 30 days',
'daemon.usage.rangeGroup': 'Summary period',
'daemon.usage.tokensConsumed': 'tokens consumed',
'daemon.usage.sessions': 'Sessions',
'daemon.usage.requests': 'Requests',
'daemon.usage.tools': 'Tools',
'daemon.usage.changes': 'Changes',
'daemon.usage.breakdownTitle': 'Token Breakdown',
'daemon.usage.inputTokens': 'Input tokens',
'daemon.usage.inputHint': 'request + cache read',
'daemon.usage.outputTokens': 'Output tokens',
'daemon.usage.outputHint': 'response + reasoning',
'daemon.usage.cacheRead': 'Cache read',
'daemon.usage.cacheHint': 'cache read share',
'daemon.usage.heatmapTitle': 'Token Heatmap',
'daemon.usage.heatmapSub': (v) =>
`recent ${v?.months ?? 12} months · daily aggregated tokens`,
'daemon.usage.low': 'Low',
'daemon.usage.high': 'High',
'daemon.usage.dowMon': 'Mon',
'daemon.usage.dowWed': 'Wed',
'daemon.usage.dowFri': 'Fri',
'daemon.usage.empty': 'No token usage recorded yet.',
'daemon.usage.loading': 'Loading usage…',
'daemon.usage.failed': 'Failed to load usage',
'daemon.usage.cellTokens': (v) =>
`${v?.date ?? ''} · Tokens: ${v?.tokens ?? '0'} · Cache: ${v?.cache ?? 0}%`,
'daemon.usage.rangeWordToday': 'Today',
'daemon.usage.rangeWordWeek': '7 days',
'daemon.usage.rangeWordMonth': '30 days',
'daemon.usage.modelShareTitle': 'model share',
'daemon.usage.modelShareSub': 'token share · light green shows cache read',
'daemon.usage.modelMeta': (v) =>
`${v?.tokens ?? '0'} tokens · cache ${v?.cache ?? 0}%`,
'daemon.usage.skillTitle': 'skill calls',
'daemon.usage.skillSub': 'skill name / count',
'daemon.usage.skillName': 'Skill name',
'daemon.usage.skillCount': 'Count',
'daemon.usage.dailyTokensTitle': 'tokens',
'daemon.usage.dailyTokensSub': 'daily token totals',
'daemon.usage.dailySessionsTitle': 'sessions',
'daemon.usage.dailySessionsSub': 'active session counts per day',
'delete.cannotCurrent':
'Cannot delete the current session while it is running.',
'delete.action': 'Delete',
'delete.deleted': 'Session deleted.',
'delete.deletedCount': (v) => `${v?.count ?? 0} session(s) deleted.`,
'delete.deleting': 'Deleting...',
'delete.failed': (v) =>
`Failed to delete session.${v?.reason ? ` ${v.reason}` : ''}`,
'delete.footer': '↑↓ navigate · Space select · Enter delete · Esc cancel',
'delete.noMatch': (v) => `No session matching "${v?.query ?? ''}"`,
'delete.none': 'No sessions to delete',
'delete.allFailed': (v) =>
`Failed to delete ${v?.count ?? 0} session(s): ${v?.reason ?? 'unknown error'}`,
'delete.nonRemoved': 'No sessions were deleted.',
'delete.notFound': 'Session not found — it may have been deleted already.',
'delete.partialFail': (v) =>
`${v?.removed ?? 0} deleted, ${v?.failed ?? 0} failed: ${v?.detail ?? 'unknown error'}`,
'delete.matches': (v) => `${v?.count ?? 0} matches`,
'delete.pressSearch': 'Press / to search; Space to select; Enter to delete',
'delete.selected': (v) => `${v?.count ?? 0} selected`,
'delete.title': 'Delete Session',
'time.justNow': 'just now',
'time.minutesAgo': (v) => `${v?.count ?? 0} min ago`,
'time.hoursAgo': (v) => `${v?.count ?? 0}h ago`,
'time.daysAgo': (v) => `${v?.count ?? 0}d ago`,
'dialog.footer.close': 'Esc to close',
'dialog.footer.confirmCancel': 'Enter to confirm · Esc to cancel',
'release.cannotCurrent': 'Cannot release the current active session.',
'release.action': 'Release',
'release.released': 'Session released successfully.',
'release.failed': (v) =>
`Failed to release session.${v?.reason ? ` ${v.reason}` : ''}`,
'release.footer': '↑↓ to navigate · Enter to release · Esc to cancel',
'release.inactive': 'Only active live sessions can be released.',
'release.inactiveBadge': 'inactive',
'release.noMatch': (v) => `No session matching "${v?.query ?? ''}"`,
'release.matches': (v) => `${v?.count ?? 0} matches`,
'release.none': 'No live sessions to release',
'release.pressSearch':
'Press / to search; Enter releases the selected live session',
'release.releasing': 'Releasing...',
'release.title': 'Release Session',
'dialog.footer.menu': 'Esc to menu',
'dialog.footer.mcpServers':
'↑↓ to navigate · Enter details · r refresh · Esc close',
'dialog.footer.mcpSelect': '↑↓ to navigate · Enter select · Esc back',
'dialog.footer.modelFast':
'↑↓ to navigate · / to search · c for custom · Enter to set fast model · Esc to cancel',
'dialog.footer.navSelectCancel':
'↑↓ to navigate · Enter to select · Esc to cancel',
'dialog.footer.navSelectClose':
'↑↓ to navigate · Enter to select · Esc to close',
'dialog.footer.navSelectMenu':
'↑↓ to navigate · Enter to select · Esc to menu',
'dialog.footer.navOpenClose': '↑↓ to navigate · Enter to open · Esc to close',
'dialog.footer.navOpenMenu': '↑↓ to navigate · Enter to open · Esc to menu',
'dialog.footer.back': 'Esc to go back',
'dialog.footer.backClose': 'Esc to close',
'dialog.footer.saveClose':
'↑↓ switch fields · ⌘/Ctrl+Enter to save · Esc to close',
'dialog.footer.saveMenu':
'↑↓ switch fields · ⌘/Ctrl+Enter to save · Esc to menu',
'dialog.footer.search': 'Type to search · Enter to commit · Esc to clear',
'dialog.footer.select': 'Enter to select',
'editor.escClearHint': 'Press Esc again to clear',
'editor.hintCommands': 'commands',
'editor.hintFiles': 'Files',
'editor.hintNext': 'next',
'editor.hintPrev': 'previous',
'editor.hintSearch': 'search',
'editor.noHistory': 'No matching history',
'editor.placeholder': 'Type a message or @ file path',
'history.loadingEarlier': 'Loading earlier messages…',
'history.openEarlier': 'Open earlier history',
'history.loadEarlier': 'Load earlier',
'history.loadNewer': 'Load newer',
'history.returnLatest': 'Return to latest',
'history.viewUnavailable':
'History is temporarily unavailable while the session reconnects or repairs its transcript.',
'history.snapshotView': 'Historical snapshot · read-only',
'history.viewError':
'This section could not be loaded. Move the reading position and retry, or return to latest.',
'history.capacityReached':
'History display limit reached. Earlier messages remain saved.',
'history.paginationError': 'Earlier history could not be loaded.',
'history.retry': 'Retry',
'editor.shellPlaceholder': 'Enter terminal command',
'editor.send': 'Send message',
'editor.imagesSkipped': (v) =>
`${v?.count ?? 0} file(s) were unavailable and skipped.`,
'editor.imagesReadFailed': (v) =>
`${v?.count ?? 0} file(s) could not be read.`,
'editor.imagesTooLarge': (v) =>
`${v?.count ?? 0} file(s) exceeded the attachment size limit.`,
'editor.pastedTextShowInEditor': 'Show inline',
'editor.connectionDisconnected':
'Connection interrupted. Please try again after it reconnects.',
'editor.sessionLoading': 'Session is still loading. Try again in a moment.',
'editor.processing': 'Processing. New messages will be queued.',
'editor.searchHint': 'ctrl+r next · tab accept · enter send · esc cancel',
'editor.searchLabel': 'reverse-i-search:',
'editor.searchPlaceholder': 'type to search...',
'editor.newSessionSuggestionTitle': 'This looks like a new topic',
'editor.newSessionSuggestionStart': 'Send in new session',
'editor.btwSuggestionTitle': 'This looks like a side question',
'editor.btwSuggestionSend': 'Ask with BTW',
'quickActions.extensions': 'Extensions',
'quickActions.help': 'Help',
'quickActions.auth': 'Auth',
'quickActions.settings': 'Settings',
'quickActions.copy': 'Copy output',
'quickActions.shellMode': 'Shell mode',
'quickActions.exitShellMode': 'Exit Shell',
'session.missing': 'Current session does not exist',
'session.new': 'New session',
'workspace.loadFailed': 'Failed to load workspace',
'workspace.notFound': 'Workspace not found',
'workspace.notFoundDescription':
'This workspace may have been removed or the link is no longer valid.',
'workspace.loadFailedDescription':
'The workspace service could not be reached. Check the daemon and try again.',
// Scheduled tasks page
'scheduledTasks.title': 'Scheduled Tasks',
'scheduledTasks.subtitle':
'Run tasks automatically on a schedule, or trigger them manually anytime.',
'scheduledTasks.loading': 'Loading…',
'scheduledTasks.count': (v) =>
`${v?.count ?? 0} task${Number(v?.count ?? 0) === 1 ? '' : 's'}`,
'scheduledTasks.refresh': 'Refresh',
'scheduledTasks.new': 'New scheduled task',
'scheduledTasks.createViaChat': 'Create via chat',
'scheduledTasks.chatStarter':
'Help me set up a recurring scheduled task (keep it long-term). What I want: ',
'scheduledTasks.name': 'Name',
'scheduledTasks.workspace': 'Workspace',
'scheduledTasks.session.label': 'Conversation',
'scheduledTasks.session.dedicated': 'Dedicated task conversation',
'scheduledTasks.session.current': 'Current conversation',
'scheduledTasks.session.dedicatedHint':
'Runs are kept in a separate conversation created for this task.',
'scheduledTasks.session.currentHint':
'Future runs continue in the conversation that is open now.',
'scheduledTasks.session.currentUnsupported':
'Current-conversation scheduling is unavailable on this daemon.',
'scheduledTasks.session.currentUnavailable':
'Open an existing conversation before selecting the current conversation.',
'scheduledTasks.session.currentBusy':
'Wait for the current turn or pending interaction to finish.',
'scheduledTasks.session.currentIneligible':
'This conversation type cannot own a scheduled task.',
'scheduledTasks.session.currentWorkspaceMismatch':
'The current conversation belongs to a different workspace.',
'scheduledTasks.session.currentAlreadyBound':
'The current conversation is already bound to a scheduled task.',
'scheduledTasks.taskId': 'Task ID',
'scheduledTasks.schedule': 'Schedule',
'scheduledTasks.type': 'Type',
'scheduledTasks.status': 'Status',
'scheduledTasks.namePlaceholder': 'Optional — defaults to the prompt',
'scheduledTasks.prompt': 'Prompt',
'scheduledTasks.promptPlaceholder': 'What should this task do?',
'workflowRuns.title': 'Workflows',
'workflowRuns.saved': 'Saved',
'workflowRuns.active': 'Running',
'workflowRuns.history': 'History',
'workflowRuns.create': 'New',
'workflowRuns.refresh': 'Refresh',
'workflowRuns.loading': 'Loading workflow runs…',
'workflowRuns.loadFailed': 'Failed to load workflow runs.',
'workflowRuns.noSession':
'Open a session in this project to view its workflow runs.',
'workflowRuns.emptyActive': 'No workflows are currently running.',
'workflowRuns.emptyHistory': 'No saved workflow runs yet.',
'workflowRuns.emptySaved': 'No reusable workflows saved yet.',
'workflowRuns.emptySavedHint':
'Select New to create one with Qwen Code, save a completed run from the terminal, or add a .js file under .qwen/workflows.',
'workflowRuns.project': 'Project',
'workflowRuns.user': 'User',
'workflowRuns.projectDescription': 'Available in this project',
'workflowRuns.userDescription': 'Available across projects',
'workflowRuns.extension': 'Extension',
'workflowRuns.extensionDescription': 'Provided by an installed extension',
'workflowRuns.detail.toggle': (v) => `Show details for ${v?.name ?? ''}`,
'workflowRuns.detail.loading': 'Loading workflow definition…',
'workflowRuns.detail.unavailable':
'This workflow definition is no longer available.',
'workflowRuns.detail.loadFailed': 'Could not read the workflow definition.',
'workflowRuns.detail.retry': 'Retry',
'workflowRuns.detail.noDescription': 'This workflow declares no description.',
'workflowRuns.detail.whenToUse': 'When to use',
'workflowRuns.detail.metaError': (v) =>
`The meta block could not be parsed: ${v?.error ?? ''}`,
'workflowRuns.detail.phases': (v) => `Phases (${v?.count ?? 0})`,
'workflowRuns.detail.recentRuns': 'Recent runs',
'workflowRuns.detail.noRuns': 'No runs in this session yet.',
'workflowRuns.detail.viewRuns': (v) =>
`View ${v?.count ?? 0} ${v?.count === 1 ? 'run' : 'runs'} in History`,
'workflowRuns.detail.showSource': 'Show source',
'workflowRuns.detail.hideSource': 'Hide source',
'workflowRuns.run': 'Run',
'workflowRuns.starting': 'Starting…',
'workflowRuns.runNamed': (v) => `Run ${v?.name ?? ''}`,
'workflowRuns.startFailed':
'The saved workflow could not be started. Refresh and try again.',
'scheduledTasks.reference.extension': 'Extensions',
'scheduledTasks.reference.skill': 'Skills',
'scheduledTasks.reference.mcp': 'MCP',
'scheduledTasks.referencePicker': 'Reference picker',
'scheduledTasks.reference.remove': 'Remove',
'scheduledTasks.reference.loading': 'Loading…',
'scheduledTasks.reference.empty': 'No available items.',
'scheduledTasks.frequency': 'Frequency',
'scheduledTasks.freq.daily': 'Daily',
'scheduledTasks.freq.weekdays': 'Weekdays',
'scheduledTasks.freq.weekly': 'Weekly',
'scheduledTasks.freq.hourly': 'Hourly',
'scheduledTasks.freq.minutes': 'Every N minutes',
'scheduledTasks.freq.custom': 'Custom (cron)',
'scheduledTasks.time': 'Time',
'scheduledTasks.weekday': 'Weekday',
'scheduledTasks.interval': 'Minutes',
'scheduledTasks.cron': 'Cron expression',
'scheduledTasks.weekdayNames': 'Sun,Mon,Tue,Wed,Thu,Fri,Sat',
'scheduledTasks.human.daily': (v) => `Daily at ${v?.time ?? ''}`,
'scheduledTasks.human.weekdays': (v) => `Weekdays at ${v?.time ?? ''}`,
'scheduledTasks.human.weekly': (v) =>
`Every ${v?.day ?? ''} at ${v?.time ?? ''}`,
'scheduledTasks.human.hourly': (v) => `Hourly at :${v?.min ?? '00'}`,
'scheduledTasks.human.everyMinutes': (v) => `Every ${v?.n ?? ''} minutes`,
'scheduledTasks.never': 'Never run',
'scheduledTasks.repeats': 'Repeats',
'scheduledTasks.runsOnce': 'Runs once',
'scheduledTasks.lastFired': (v) => `Last run: ${v?.when ?? ''}`,
'scheduledTasks.runNow': 'Run now',
'scheduledTasks.enable': 'Enable',
'scheduledTasks.disable': 'Disable',
'scheduledTasks.delete': 'Delete',
'scheduledTasks.deleteConfirmTitle': 'Delete scheduled task',
'scheduledTasks.deleteConfirm': (v) =>
`Delete scheduled task "${v?.name ?? ''}"?`,
'scheduledTasks.deletedSnapshot':
'This scheduled task has been deleted. Showing the snapshot from when it was created.',
'scheduledTasks.sessionScopedSnapshot':
'This is a session-scoped scheduled task. Showing the snapshot from when it was created.',
'scheduledTasks.empty': 'No scheduled tasks yet. Create one to get started.',
'scheduledTasks.create': 'Create',
'scheduledTasks.creating': 'Creating…',
'scheduledTasks.cancel': 'Cancel',
'scheduledTasks.error.invalidSchedule': 'Invalid schedule',
'scheduledTasks.error.workspaceUnavailable':
'The selected workspace is unavailable or untrusted',
'scheduledTasks.error.emptyPrompt': 'Prompt is required',
'scheduledTasks.error.promptTooLong': (v) =>
`Prompt exceeds ${v?.max ?? 100_000}-character limit`,
'scheduledTasks.error.goalActive':
'Cannot start a scheduled task while a Goal is active.',
'scheduledTasks.error.toggleFailed': 'Failed to update task',
'scheduledTasks.error.deleteFailed': 'Failed to delete task',
'scheduledTasks.edit': 'Edit',
'scheduledTasks.editTitle': 'Edit scheduled task',
'scheduledTasks.save': 'Save',
'scheduledTasks.saving': 'Saving…',
'scheduledTasks.runHistory': (v) => `Run history (${v?.count ?? 0})`,
'scheduledTasks.viewHistory': (v) => `View conversation (${v?.count ?? 0})`,
'scheduledTasks.viewHistoryEmpty': 'View conversation',
'scheduledTasks.viewHistoryHint': "Open the task's session to see its runs",
'scheduledTasks.runKind.catchUp': 'late',
'scheduledTasks.runKind.manual': 'manual',
'scheduledTasks.runKind.withheld': 'skipped',
'scheduledTasks.runKind.sessionDispatchFailed':
'new session failed, nothing ran',
'scheduledTasks.runKind.sessionDispatchFallback':
'new session failed, ran in the task session',
'scheduledTasks.openRunSession': 'Open this run session',
'scheduledTasks.runContext.title': 'Scheduled task run',
'scheduledTasks.runContext.taskId': 'Task ID',
'scheduledTasks.runContext.schedule': 'Schedule',
'scheduledTasks.runContext.triggeredAt': 'Triggered',
'scheduledTasks.runContext.trigger.scheduled': 'Scheduled',
'scheduledTasks.runContext.trigger.manual': 'Run manually',
'scheduledTasks.error.runFailed': 'Failed to record the run',
'scheduledTasks.error.oneShotConsumedButFailed':
'The task was deleted but the prompt could not be delivered — it never ran. Recreate it to try again.',
'scheduledTasks.dueNow': 'Due now',
'scheduledTasks.nextRunTooltip': (v) => `Next run: ${v?.when ?? ''}`,
'scheduledTasks.dur.d': 'd',
'scheduledTasks.dur.h': 'h',
'scheduledTasks.dur.m': 'm',
'scheduledTasks.dur.s': 's',
'scheduledTasks.runIn': 'Run in',
'scheduledTasks.sessionMode.perRun': 'A new session every run',
'scheduledTasks.sessionMode.persistent': 'Persistent task session',
'scheduledTasks.sessionMode.perRun.hint':
'Each run gets a clean context and its own conversation.',
'scheduledTasks.sessionMode.persistent.hint':
'All runs continue in the same task conversation.',
'scheduledTasks.model': 'Model',
'scheduledTasks.model.workspaceDefault': 'Workspace default',
'scheduledTasks.model.hint':
'The selected model is applied when each new run session is created.',
'scheduledTasks.group': 'Session group',
'scheduledTasks.group.none': 'No group',
'scheduledTasks.group.create': 'Create a new group…',
'scheduledTasks.group.name': 'New group name',
'scheduledTasks.group.color': 'Group color',
'scheduledTasks.group.hint': 'Each run conversation is placed in this group.',
'scheduledTasks.group.nameRequired': 'Enter a name for the new group.',
'scheduledTasks.routing.loading': 'Loading models and groups…',
'scheduledTasks.condition': 'Precondition (optional)',
'scheduledTasks.conditionPlaceholder':
'e.g. Check whether anything landed on main since yesterday. If nothing did, the task should not run.',
'scheduledTasks.condition.hint':
"Checked in this task's own session before each run. The prompt only runs in a fresh session when the check says yes — otherwise the run is skipped.",
'scheduledTasks.condition.cardPrefix': 'If:',
'turnOutputs.filesEdited': (v) => `Edited ${v?.count ?? 0} files`,
'turnOutputs.imagePreview': 'Image Preview',
'turnOutputs.viewChanges': 'View changes',
// Key keeps its historical `review` name; the label moved to "Changes" when
// the code-review result view (`codeReview.*`) took over the word.
'turnOutputs.review': 'Changes',
'turnOutputs.reviewLatest': 'View recent file changes',
'codeReview.authoritativeVerdict': 'Authoritative verdict',
'codeReview.targetEffort': (v) =>
`Target: ${v?.target ?? ''} · Effort: ${v?.effort ?? ''}`,
'codeReview.openReport': 'Open Markdown report',
'codeReview.loadingReport': 'Loading Markdown report...',
'codeReview.back': 'Back to review',
'codeReview.reviewCounts': 'Review counts',
'codeReview.total': 'Total',
'codeReview.confidence': (v) => `${v?.value ?? ''} confidence`,
'codeReview.held': 'Held',
'codeReview.heldByMeasurement': 'Held back from Critical by measurement',
'codeReview.caps': 'Caps',
'codeReview.none': 'None',
'codeReview.severity': 'Severity',
'codeReview.confidenceLabel': 'Confidence',
'codeReview.all': 'All',
'codeReview.noMatches': 'No findings match these filters.',
'codeReview.source': (v) => `Source: ${v?.value ?? ''}`,
'codeReview.failureScenario': 'Failure scenario',
'codeReview.witness': 'Witness',
'codeReview.suggestedFix': 'Suggested fix',
'codeReview.outcome': 'Outcome',
'codeReview.locations': 'Locations',
'codeReview.evidence': 'Evidence',
'codeReview.notLinked': 'not linked',
'codeReview.loadErrorTitle': 'Unable to display code review',
'codeReview.loading': 'Loading code review...',
'codeReview.artifactTruncated':
'Code review artifact is truncated and cannot be validated.',
'codeReview.reportTruncated': 'Markdown report is truncated.',
'codeReview.unavailable': (v) =>
`This code review is no longer authoritative because its artifact status is ${v?.status ?? 'unknown'}. Regenerate the review to view it.`,
'codeReview.workspaceRequired':
'Code review artifacts must be readable workspace files.',
'sideTask.title': 'Side task',
'sideTask.description': 'View or create side tasks',
'sideTask.new': 'New',
'sideTask.create': 'New side task',
'webPreview.title': 'Web preview',
'webPreview.openHint': 'Preview a running web app',
'webPreview.address': 'Development URL',
'webPreview.open': 'Open',
'webPreview.refresh': 'Refresh preview',
'webPreview.desktop': 'Desktop width',
'webPreview.mobile': 'Mobile width (390 px)',
'webPreview.external': 'Open externally',
'webPreview.frame': 'Web preview frame',
'webPreview.saved': 'Saved version',
'webPreview.savedFrame': 'Saved webpage version',
'webPreview.savedUnavailable':
'This saved version is missing or has changed. It cannot be opened.',
'webPreview.savedLoadFailed': 'Could not load this saved version. Try again.',
'webPreview.page': 'Application preview',
'webPreview.empty':
'Start your development server, then enter its URL above.',
'webPreview.reachable':
'Use an address this browser can reach. For a remote server, use its accessible URL or an existing port forward.',
'webPreview.fallback':
'Blank page? Check the server or open externally. The address and refresh use the entry URL.',
'webPreview.live':
'Live page. Opening a link from an earlier message shows its current content, not a saved version.',
'webPreview.invalidUrl':
'Use a separate HTTP/HTTPS development address with a hostname or IPv4 address, without login credentials. Web Shell and daemon addresses cannot be previewed.',
'terminal.title': 'Terminal',
'terminal.open': 'Open a terminal',
'terminal.notice.exited': (v) =>
`Process exited with code ${v?.exitCode ?? '?'}`,
'terminal.notice.error': (v) => `Error: ${v?.message ?? ''}`,
'terminal.notice.unknownError': 'Unknown error',
'terminal.notice.reconnecting': 'Connection lost — reconnecting…',
'terminal.notice.protocolMismatch':
'Terminal protocol changed; restart the daemon and reload this page.',
'localFiles.title': 'Local files',
'localFiles.trigger': 'Local files',
'localFiles.hint':
'Lets this session read and write one directory on your own machine. Files stay on your computer; only what the agent asks for is sent to it.',
'localFiles.connect': 'Connect a directory…',
'localFiles.reconnect': 'Reconnect',
'localFiles.disconnect': 'Disconnect',
'localFiles.openInNewTab': 'Open in a new tab',
'localFiles.directory': 'Directory',
'localFiles.tools': (v) => `${v?.count ?? 0} tools`,
'localFiles.status.idle': 'Not connected',
'localFiles.status.connecting': 'Connecting…',
'localFiles.status.registering': 'Registering…',
'localFiles.status.connected': 'Connected',
'localFiles.status.reconnecting': 'Reconnecting…',
'localFiles.status.heldElsewhere': 'Connected in another tab',
'localFiles.status.needsSession': 'Waiting for a session',
'localFiles.status.needsGesture': 'Reconnect to continue',
'localFiles.status.failed': 'Failed',
'localFiles.status.unavailable': 'Unavailable here',
'localFiles.status.resolving': 'Resolving…',
'localFiles.needsSessionHint':
'Start a session first. The bridge binds to exactly one session, so no other session can reach your files.',
'localFiles.blocker.insecureContext':
'This page is not a secure context, so the browser will not grant local file access. Serve the Web Shell over https, or forward the daemon port with SSH and open http://localhost:<port>.',
'localFiles.blocker.crossOriginFrame':
'Local file access is blocked inside a cross-origin frame. Open the Web Shell in its own browser tab to connect a directory.',
'localFiles.blocker.unsupportedBrowser':
'This browser has no File System Access API. Use Chrome or Edge to connect a local directory.',
'localFiles.blocker.workspaceIneligible':
"This conversation's workspace cannot host a local directory (untrusted or live workspace).",
'localFiles.blocker.workspaceResolving':
'Which workspace this conversation belongs to is not known yet.',
'localFiles.blocker.unsupportedDaemon':
'This daemon does not advertise the client filesystem bridge (client_mcp_over_ws). Start the daemon with QWEN_SERVE_CLIENT_MCP_OVER_WS=1 to enable local files.',
...FILES_MESSAGES_EN,
'rightPanel.add': 'Add panel',
'attachment.showPreview': 'Preview',
'attachment.showSource': 'Source',
'attachment.previewUnsupported':
'Preview is not available for this file type.',
'attachment.readFailed': 'Failed to read attachment.',
'attachment.loadingFile': 'Loading file...',
'attachment.loadingPreview': 'Loading preview...',
'sideTask.creating': 'Creating side task…',
'sideTask.createFailed': 'Failed to create side task',
'sideTask.commandsLoadingTimedOut':
'Command information is still unavailable. Your side-task prompt has been kept and will be checked when it loads.',
'sideTask.promptFailed': 'Failed to send the side-task question',
'sideTask.renameFailed': 'Failed to name side task',
'turnOutputs.preview': 'Preview',
'turnOutputs.collapseFiles': 'Collapse files',
'turnOutputs.showMoreFiles': (v) => `Show ${v?.count ?? 0} more files`,
'turnOutputs.collapseArtifacts': 'Collapse artifacts',
'turnOutputs.showMoreArtifacts': (v) =>
`Show ${v?.count ?? 0} more artifacts`,
'turnOutputs.previousTurn': 'Previous turn',
'turnOutputs.fileCount': (v) => `${v?.count ?? 0} files`,
'turnOutputs.openFileTree': 'Open file tree',
'turnOutputs.closeFileTree': 'Close file tree',
'turnOutputs.artifactMissing': 'File not found in the workspace',
'turnOutputs.artifactUnavailable': (v) =>
v?.path
? `File not found in the workspace · ${v.path}`
: 'File not found in the workspace',
'sidebar.label': 'Workspace sidebar',
'sidebar.home': 'Home',
'sidebar.channelSettings': 'Settings',
'sidebar.liveSettings': 'Settings',
'sidebar.liveSettingsUnavailable':
'Live settings are not available on this server.',
'sidebar.more': 'More',
'sidebar.navigation': 'Main navigation',
'sidebar.toggleMenu': 'Toggle menu',
'sidebar.newChat': 'New chat',
'sidebar.newTask': 'New task',
'sidebar.newWorktreeTask': 'New worktree task',
'sidebar.plugins': 'Plugins',
'sidebar.channels': 'Channels',
'sidebar.sessionSource': 'Session source',
'sidebar.sessionSource.tasks': 'Tasks',
'sidebar.sessionSource.channels': 'Channels',
'sidebar.channelType.other': 'Other channels',
'sidebar.live': 'Live',
'sidebar.liveVoicePending': 'Voice chat',
'sidebar.project': 'Project',
'sidebar.pinnedSessions': 'Pinned',
'sidebar.workspaceSelectLabel': 'Workspace',
'sidebar.noWorkspace': 'No workspace',
'sidebar.noWorkspaceSessions': 'No-workspace sessions',
'sidebar.copySessionId': 'Copy session ID',
'sidebar.copySessionIdFailed': 'Failed to copy session ID',
'sidebar.sessionIdCopied': 'Session ID copied',
'sidebar.workspaceUntrusted': 'untrusted',
'sidebar.manageWorkspaces': 'Manage workspaces…',
'sidebar.workspaceReadOnly': 'read-only',
'sidebar.workspaceTrustToOpen': 'Trust this workspace to open the session.',
'sidebar.addWorkspace': 'Add workspace',
'sidebar.newWorkspace': 'New workspace',
'sidebar.startFromScratch': 'Start from scratch',
'sidebar.useExistingFolder': 'Use an existing folder…',
'sidebar.scratchOutcomeUnknownTitle': 'Check workspace creation',
'sidebar.scratchOutcomeUnknown':
'The daemon response was interrupted. Check the refreshed workspace list before creating another workspace.',
'sidebar.scratchOutcomeRefresh': 'Refresh workspace list',
'sidebar.scratchOutcomeAcknowledge': 'I checked the workspace list',
'sidebar.addWorkspaceTitle': 'Add Workspace',
'sidebar.addWorkspacePath': 'Directory path',
'sidebar.addWorkspaceBrowse': 'Browse…',
'sidebar.addWorkspaceBrowseError':
'Unable to open the system folder picker. Enter an absolute path instead.',
'sidebar.addWorkspaceDisplayName': 'Display name (optional)',
'sidebar.addWorkspaceDisplayNameHint':
'Shown in Web Shell; the directory path remains the workspace identity.',
'sidebar.addWorkspaceRegister': 'Register',
'sidebar.addWorkspaceCancel': 'Cancel',
'sidebar.addWorkspaceError': 'Failed to add workspace',
'sidebar.addWorkspaceBusyError': 'Another workspace operation is in progress',
'sidebar.addWorkspacePersistenceError':
'The daemon did not confirm persistent workspace registration',
'sidebar.addWorkspaceRefreshError':
'Workspace added, but the workspace list could not be refreshed',
'sidebar.addWorkspaceAbsError':
'Enter an absolute path or an SSH workspace URL.',
'sidebar.addWorkspaceHint':
'Enter a local absolute path or ssh://user@host/absolute/project. SSH requires key authentication, a trusted host key and Python 3 on the remote computer. Shell commands also require Bash; Qwen is not required there.',
'sidebar.addWorkspaceSuggestions': 'Directory suggestions',
'sidebar.addWorkspacePersist': 'Keep after daemon restart',
'sidebar.addWorkspacePersistHint':
'Persist this workspace registration in the daemon configuration.',
'sidebar.addWorkspaceAdding': 'Adding…',
'workspaceHost.source': 'Folder source',
'workspaceHost.thisComputer': 'This computer',
'workspaceHost.folderOn': (vars) => `Folder on ${vars?.address}`,
'workspaceHost.folderOnThisComputer': 'Folder on this computer',
'workspaceHost.browseHint':
'Choose a folder below, or type an absolute path.',
'workspaceHost.parent': 'Parent folder',
'workspaceHost.addFolder': 'Add this folder',
'workspaceHost.noFolders': 'No subfolders in this directory.',
'workspaceHost.folderListError':
'Could not read folders from this computer. Check the path or connection.',
'workspaceHost.navigationUnavailable':
'Browser storage is unavailable, so the remote folder flow cannot continue safely.',
'workspaceHost.unsupported':
'This computer does not support adding workspaces.',
'workspaceHost.loadingFolders': 'Loading folders from this computer…',
'workspaceHost.connectionError':
'Could not load workspace capabilities from this computer.',
'sidebar.removeWorkspace': 'Remove workspace',
'sidebar.workspaceActions': 'Workspace actions',
'sidebar.renameWorkspace': 'Rename…',
'sidebar.renameWorkspaceTitle': 'Rename Workspace',
'sidebar.workspaceNamePrompt': 'Display name',
'sidebar.workspaceNameHint': 'Leave empty to show the folder name.',
'sidebar.workspaceNameInvalid': 'Names cannot contain control characters.',
'sidebar.renameWorkspaceFailed': 'Failed to rename workspace',
'sidebar.copyWorkspacePath': 'Copy path',
'sidebar.copyWorkspacePathFailed': 'Failed to copy workspace path',
'sidebar.openWorkspaceFolder': 'Open folder',
'sidebar.openWorkspaceFolderFailed': 'Failed to open the workspace folder',
'sidebar.openWorkspaceFolderOpened': 'Opened the workspace folder',
'sidebar.openWorkspaceTerminal': 'Open terminal',
'sidebar.openWorkspaceTerminalFailed': 'Failed to open a terminal',
'sidebar.openWorkspaceTerminalOpened': 'Opened a terminal at the workspace',
'sidebar.manageWorkspace': 'Manage',
'sidebar.reloadWorkspace': 'Reload runtime',
'sidebar.reloadWorkspaceFailed': 'Failed to reload workspace runtime',
'sidebar.workspaceCount': (v) => `${v?.count ?? 0} workspaces`,
'sidebar.sessionsRunning': (v) =>
`${v?.count ?? 0} running session${v?.count === 1 ? '' : 's'}`,
'sidebar.sessionsAttention': (v) =>
`${v?.count ?? 0} session${v?.count === 1 ? '' : 's'} waiting for you`,
'sidebar.sessionsTotal': (v) =>
`${v?.count ?? 0}${v?.truncated ? '+' : ''} session${v?.count === 1 && !v?.truncated ? '' : 's'}`,
'sidebar.overview.sessions': 'Sessions',
'sidebar.overview.mcp': 'MCP',
'sidebar.overview.skills': 'Skills',
'sidebar.overview.extensions': 'Extensions',
'sidebar.overview.channels': 'Channels',
'sidebar.overview.context': 'Context',
'sidebar.overview.hooks': 'Hooks',
'sidebar.overview.settings': 'Settings',
'sidebar.overview.mcpDetail': (v) =>
`${v?.connected ?? 0} of ${v?.configured ?? 0} connected` +
(Number(v?.failed) > 0 ? `, ${v?.failed} failed` : '') +
(Number(v?.disabled) > 0 ? `, ${v?.disabled} disabled` : ''),
'sidebar.overview.skillsDetail': (v) =>
`${v?.enabled ?? 0} of ${v?.total ?? 0} enabled`,
'sidebar.overview.extensionsDetail': (v) =>
`${v?.active ?? 0} of ${v?.total ?? 0} active`,
'sidebar.overview.channelsDetail': (v) =>
`${v?.connected ?? 0} of ${v?.configured ?? 0} connected` +
(Number(v?.failed) > 0 ? `, ${v?.failed} failed` : ''),
'sidebar.overview.contextDetail': (v) =>
`${v?.files ?? 0} context file${v?.files === 1 ? '' : 's'}, ${v?.rules ?? 0} rule${v?.rules === 1 ? '' : 's'}`,
'sidebar.overview.hooksDetail': (v) =>
`${v?.count ?? 0} hook${v?.count === 1 ? '' : 's'}`,
'sidebar.overview.hooksDisabled': (v) =>
`${v?.count ?? 0} hook${v?.count === 1 ? '' : 's'} (disabled)`,
'sidebar.forceRemoveWorkspace': 'Force remove',
'sidebar.removeWorkspaceTitle': 'Remove Workspace',
'sidebar.removeWorkspaceConfirm': (v) =>
`Remove the runtime and persistent registration for “${v?.name ?? ''}”? Files, settings, and session history will not be deleted.`,
'sidebar.removeWorkspaceBusy': (v) =>
`“${v?.name ?? ''}” still has active runtime resources. Force removal will terminate them.`,
'sidebar.removeWorkspaceCurrentSession':
'Switch to another workspace or close the current session before forcing removal.',
'sidebar.removeWorkspaceInProgress':
'Another client is already removing this workspace. Refresh after that operation finishes.',
'sidebar.removeWorkspaceError': 'Failed to remove workspace',
'sidebar.removeWorkspaceSessions': (v) => `Sessions: ${v?.count ?? 0}`,
'sidebar.removeWorkspacePrompts': (v) => `Active prompts: ${v?.count ?? 0}`,
'sidebar.removeWorkspaceStarts': (v) =>
`Pending session starts: ${v?.count ?? 0}`,
'sidebar.removeWorkspaceConnections': (v) =>
`ACP connections: ${v?.count ?? 0}`,
'sidebar.removeWorkspaceMemoryTasks': (v) => `Memory tasks: ${v?.count ?? 0}`,
'sidebar.removeWorkspaceWorkers': (v) => `Channel workers: ${v?.count ?? 0}`,
'sidebar.removeWorkspaceVoiceSessions': (v) =>
`Voice sessions: ${v?.count ?? 0}`,
'sidebar.noSessions': 'No sessions.',
'sidebar.projectFallback': 'Project',
'sidebar.sessionsOverview': 'Session Overview',
'sidebar.splitView': 'Split View',
'sidebar.settings': 'Settings',
'update.button': 'Update',
'update.restarting': 'Restarting…',
'update.readyTitle': (v) => `Update to v${v?.version} and restart`,
'update.failed':
'Update could not finish. Check the service connection and retry.',
'sidebar.daemonStatus': 'Daemon Status',
'sidebar.scheduledTasks': 'Scheduled Tasks',
'sidebar.workflows': 'Workflows',
'sidebar.goals': 'Goals',
'sidebar.themeLight': 'Switch to light theme',
'sidebar.themeDark': 'Switch to dark theme',
'sidebar.collapse': 'Collapse',
'sidebar.expand': 'Expand',
'sidebar.showAllSessions': 'Show all',
'sidebar.collapseProject': 'Collapse project',
'sidebar.expandProject': 'Expand project',
'sidebar.search': 'Search sessions',
'sidebar.searchPlaceholder': 'Search sessions',
'sidebar.rename': 'Rename',
'sidebar.export': 'Export conversation record',
'sidebar.exportFailed': 'Failed to export session',
'sidebar.delete': 'Delete',
'sidebar.archive': 'Archive',
'sidebar.unarchive': 'Restore',
'sidebar.moreActions': 'More actions',
'sidebar.archiveCurrentDisabled': 'The current session cannot be archived',
'sidebar.archiveRunningDisabled':
'A running session cannot be archived; archiving would stop its work',
'sidebar.archivedTitle': 'Archived',
'sidebar.standaloneLoadFailed': 'Failed to load recent conversations',
'sidebar.standaloneActionFailed': 'Conversation action failed',
'sidebar.standaloneDeleteConfirm':
'Delete this conversation and its private files?',
'sidebar.standaloneCleanupPending':
'The conversation was deleted. Private file cleanup will finish automatically.',
'sidebar.archivedEmpty': 'No archived sessions.',
'sidebar.archiveFailed': 'Failed to archive session',
'sidebar.unarchiveFailed': 'Failed to restore session',
'sidebar.loadFailed': 'Failed to load sessions. Click to retry.',
'sidebar.renameFailed': 'Failed to rename session',
'sidebar.deleteFailed': 'Failed to delete session',
'sidebar.newSessionFailed': 'Failed to create a new chat',
'sidebar.switchFailed': 'Failed to switch session',
'sidebar.currentDeleteDisabled':
'The current session is running and cannot be deleted',
'sidebar.currentStandaloneDeleteDisabled':
'Open another chat first to delete the current no-workspace session',
'sidebar.deleteConfirmDescription': (v) =>
`Delete "${v?.name ?? ''}"? This cannot be undone.`,
'sidebar.clients': (v) => `${v?.count ?? 0} client(s)`,
'sidebar.running': 'Running',
'sidebar.activeWork': 'Active work',
'sidebar.activityUnknown': 'Background activity unknown',
'sidebar.waitingForApproval': 'Waiting for approval',
'sidebar.waitingForApprovalShort': 'Approval',
'sidebar.sessionPr': (v) => `Pull Request #${v?.number ?? ''}`,
'sidebar.sessionPrMultiple': (v) =>
`Pull Request #${v?.number ?? ''} (${v?.count ?? 0} total)`,
'sidebar.sessionPrStateMerged': 'Merged',
'sidebar.sessionPrStateClosed': 'Closed',
'sidebar.sessionIssue': (v) => `Issue #${v?.number ?? ''}`,
'sidebar.sessionIssueStateCompleted': 'Completed',
'sidebar.sessionIssueStateNotPlanned': 'Not planned',
'sidebar.userInputNeeded': 'User input needed',
'sidebar.userInputNeededShort': 'Input',
'sidebar.completedUnread': 'Finished',
'sidebar.pin': 'Pin',
'sidebar.unpin': 'Unpin',
'sidebar.sessionGroup': 'Group',
'sidebar.groupFilter': 'Session group',
'sidebar.groupAll': 'All',
'sidebar.groupPinned': 'Pinned',
'sidebar.groupUngrouped': 'Ungrouped',
'sidebar.groupRecent': 'Recent',
'sidebar.groupCreate': 'Create group',
'sidebar.groupRename': 'Rename group',
'sidebar.groupDelete': 'Delete group',
'sidebar.groupColor': 'Group color',
'sidebar.groupNamePrompt': 'Group name',
'sidebar.groupDeleteConfirm': (v) => `Delete group "${v?.name ?? ''}"?`,
'sidebar.groupsLoadFailed': 'Failed to load session groups',
'sidebar.groupCreateFailed': 'Failed to create group',
'sidebar.groupAssignFailedAfterCreate':
'Group created, but failed to move session into it',
'sidebar.groupUpdateFailed': 'Failed to update group',
'sidebar.groupDeleteFailed': 'Failed to delete group',
'sidebar.organizationFailed': 'Failed to update session organization',
'sidebar.groupColor.red': 'Red',
'sidebar.groupColor.orange': 'Orange',
'sidebar.groupColor.yellow': 'Yellow',
'sidebar.groupColor.green': 'Green',
'sidebar.groupColor.blue': 'Blue',
'sidebar.groupColor.purple': 'Purple',
'sidebar.groupColor.custom': 'Custom…',
'sidebar.groupColor.picker': 'Choose custom group color',
'sidebar.groupColor.hex': 'Hex color',
'sidebar.groupColor.invalid': 'Enter a six-digit Hex color such as #416ef5.',
'quickKeys.retry': 'Retry failed',
'error.unsupportedTheme':
'Unsupported theme. Use /theme light or /theme dark.',
'queue.delete': 'Delete',
'queue.edit': 'Edit',
'queue.insert': 'Insert',
'queue.cleared': 'Queue cleared.',
'queue.deleteTip': 'Remove from queue',
'queue.editTip': 'Remove from queue and edit again',
'queue.submitting': 'Submitting...',
'queue.midTurnQueued': 'Queued...',
'queue.serverQueued': 'Queued on server...',
'queue.editing': 'Editing...',
'queue.inserting': 'Inserting...',
'queue.removing': 'Updating...',
'queue.submittingDisabled': 'Submitting queued message...',
'queue.summaryEditDisabled':
'This restored queue summary cannot recover its original attachments.',
'queue.admissionUnknown':
'Delivery is uncertain. Check the session before trying again.',
'queue.restoreUnknown': 'Restore local copy',
'queue.discardUnknown': 'Discard local copy',
'queue.continueEditing': 'Continue editing',
'queue.continueEditingConfirm':
'The prompt may already be running. Continue editing only if you accept the risk of sending it twice.',
'queue.commandBlocked':
"Slash commands can't be queued while a turn is running.",
'queue.commandGoalBlocked':
'Slash commands are unavailable while a Goal owns the session or its state is loading.',
'queue.shellQueued':
'Shell command queued — it will run after the current turn finishes.',
'queue.shellDropped': (v) => {
const count = v?.count ?? 0;
return count === 1
? '1 queued shell command will not run.'
: `${count} queued shell commands will not run.`;
},
'queue.queueFailed': 'Failed to queue message',
'queue.attachmentCleanupFailed': 'Failed to discard uploaded attachments',
'queue.deleteFailed': 'Failed to move message out of queue',
'queue.editFailed': 'Failed to edit queued message',
'queue.insertFailed': 'Failed to insert queued message',
'queue.insertTip': 'Insert into the current turn',
'queue.insertCommandDisabled': 'Commands cannot be inserted mid-turn',
'queue.sendNow': 'Send now',
'queue.sendNowTip':
"Send queued messages now, cutting the model's current response short unless it has started a tool call; running tools finish first",
'queue.sendNowFailed': 'Failed to send queued messages now',
'queue.footer':
'Press ↑ to edit the latest queued message · Esc to clear queue',
'queue.imageCount': (v) => `(+${v?.count ?? 0} images)`,
'queue.fileCount': (v) => `(+${v?.count ?? 0} files)`,
'queue.more': (v) => `... (+${v?.count ?? 0} more)`,
'help.builtIn': 'Built-in commands',
'help.commandCount': (v) => `${v?.count ?? 0} commands`,
'help.commandMeta.builtIn': 'built-in',
'help.commandMeta.custom': 'custom',
'help.commandMeta.subcommands': (v) => `${v?.count ?? 0} subcommands`,
'help.commandsIntro': 'Browse built-in commands:',
'help.customGroup': 'Custom, skills, plugins, MCP',
'help.customIntro': 'Browse custom, skill, plugin, and MCP commands:',
'help.empty': 'No commands are currently available.',
'help.emptyCustom': 'No custom commands are currently available.',
'help.footer':
'Tab/Shift+Tab to switch tabs · ↑/↓ or PgUp/PgDn to scroll · Esc to close',
'help.intro':
'Qwen Code understands your codebase, makes edits with your permission, and executes commands right from your terminal.',
'help.section.shortcuts': 'Shortcuts',
'help.search': 'Search commands',
'help.shortcut.addContext': 'Add files or folders as context',
'help.shortcut.altWords': 'Jump through words',
'help.shortcut.clear': 'Clear the screen',
'help.shortcut.commandMenu': 'Open command menu',
'help.shortcut.completion': 'Accept completion or switch help tabs',
'help.shortcut.history': 'Cycle prompt history or scroll lists',
'help.shortcut.searchHistory': 'Search prompt history',
'help.shortcut.newline': 'Insert a newline',
'help.shortcut.pasteImages': 'Paste images',
'help.shortcut.shell': 'Run shell commands',
'help.shortcut.togglePanel': 'Toggle this panel',
'help.shortcut.retry': 'Retry last request',
'retry.hint': 'Press Ctrl+Y to retry or click to retry',
'retry.none': 'No failed request to retry.',
'system.taskNotification': 'Task notification',
'background.result': 'Background result',
'background.agent': 'Background agent',
'background.running': 'Background tasks running',
'background.task': 'Background task',
'background.peer': 'Cross-session message',
'background.details': 'View details',
'background.processing': (v) => `Processing ${v?.label ?? ''} results`,
'background.source': 'Source',
'background.pending': 'Awaiting processing',
'system.taskCompleted': 'Background task completed',
'system.taskFailed': 'Background task failed',
'system.taskCancelled': 'Background task cancelled',
'notification.shell.completed': (v) =>
`Background shell "${v?.command ?? ''}" completed.`,
'notification.shell.failed': (v) =>
`Background shell "${v?.command ?? ''}" failed.`,
'notification.shell.cancelled': (v) =>
`Background shell "${v?.command ?? ''}" was cancelled.`,
'notification.monitor.completed': (v) =>
`Monitor "${v?.description ?? ''}" completed. (${v?.events ?? 0} events${
v?.droppedLines
? `, ${v.droppedLines} lines dropped due to throttling`
: ''
})`,
'notification.monitor.failed': (v) =>
`Monitor "${v?.description ?? ''}" failed. (${v?.events ?? 0} events${
v?.droppedLines
? `, ${v.droppedLines} lines dropped due to throttling`
: ''
})`,
'notification.monitor.cancelled': (v) =>
`Monitor "${v?.description ?? ''}" was cancelled. (${
v?.events ?? 0
} events${
v?.droppedLines
? `, ${v.droppedLines} lines dropped due to throttling`
: ''
})`,
'notification.agent.completed': (v) =>
`Background agent "${v?.description ?? ''}" completed.`,
'notification.agent.failed': (v) =>
`Background agent "${v?.description ?? ''}" failed.`,
'notification.agent.cancelled': (v) =>
`Background agent "${v?.description ?? ''}" was cancelled.`,
'branch.failed': 'Failed to branch session.',
'branch.stale':
'This response is no longer on the active history path. The transcript has been refreshed.',
'branch.staleRefreshFailed':
'This response is no longer on the active history path, and the transcript could not be refreshed. Please retry.',
'branch.staleUnsupported':
'This response is no longer on the active history path. Branching from this point is not supported by the current session.',
'branch.success': (v) =>
`Copied session. New session name: "${v?.name ?? ''}". Switched to the new session.`,
'branch.dialog.title': 'Branch session',
'branch.dialog.current.title': 'Current workspace',
'branch.dialog.current.description':
'Copy the conversation and continue using the current checkout.',
'branch.dialog.worktree.title': 'New worktree',
'branch.dialog.worktree.description':
'Create an isolated checkout from the current Git HEAD. Files are not restored to the state of this response.',
'branch.dialog.cancel': 'Cancel',
'branch.dialog.confirm': 'Branch',
'branch.dialog.creating': 'Creating…',
'branch.worktreeActivationFailed':
'The branched session was created, but its worktree could not be opened automatically. Reopen it from the session list.',
'fork.empty': 'Please provide a directive. Usage: /fork <directive>',
'fork.failed': (v) => `Failed to launch fork: ${v?.reason ?? ''}`,
'fork.notStarted': 'Background agent was not launched.',
'fork.started': (v) =>
`Started background agent: "${v?.name ?? ''}". Track it in background tasks.`,
'command.hidden': 'This command is not available.',
'help.shortcut.approvals': 'Cycle approval modes',
'help.shortcut.cancel': 'Close dialogs or cancel operation',
'bug.failed': 'Failed to load system info for bug report.',
'bug.popupBlocked': 'Popup blocked — please allow popups and try again.',
'bug.submitted': 'Bug report opened in a new tab.',
'clear.blocked': 'Cannot clear while streaming — cancel first (Esc).',
'error.unknown': 'Unknown error',
'error.modelStreamInterrupted':
'Model response stream was interrupted. Please retry.',
'error.loopDetected':
'The model got stuck while using tools or reached a safety limit, so this turn was stopped. Your session is still open—try a more specific instruction to continue.',
'shell.command': 'Shell Command',
'shell.result.timedOut': 'Timed out',
'shell.result.notices': 'Notices',
'shell.result.truncated': 'Output preview truncated',
'shell.result.outputFiles': 'Output files',
'shell.result.output': 'Output',
'shell.result.command': 'Command',
'shell.result.copy': 'Copy command',
'shell.result.details': 'Execution details',
'shell.result.directory': 'Directory',
'shell.result.timeout': 'Timeout',
'shell.result.timeoutMs': (v) => `${v?.milliseconds} ms`,
'shell.result.defaultTimeout': 'Use default',
'shell.result.exitCode': 'Exit code',
'shell.result.signal': 'Signal',
'shell.result.pending': 'Pending',
'shell.result.elapsed': 'Elapsed',
'shell.result.lines': 'Output lines',
'shell.result.bytes': 'Output bytes',
'shell.result.running': 'Running',
'shell.result.completed': 'Completed',
'shell.result.success': 'Succeeded',
'shell.result.cancelled': 'Cancelled',
'shell.result.waiting': 'Waiting for output…',
'shell.result.empty': 'No output',
'shell.result.exited': (v) => `Exited with code ${v?.code}`,
'turnCalls.open': 'View tool calls',
'turnCalls.title': 'Tool calls',
'turnCalls.count': (v) => `${v?.count ?? 0} tool calls`,
'turnCalls.tool': 'Tool call',
'turnCalls.elapsed': (v) => `Elapsed: ${v?.duration ?? ''}`,
'turnCalls.startedAt': (v) => `Start time: ${v?.time ?? ''}`,
'turnCalls.endedAt': (v) => `End time: ${v?.time ?? ''}`,
'turnCalls.empty': 'No tool call records for this turn',
'turnCalls.arguments': 'Arguments',
'turnCalls.result': 'Result',
'turnCalls.other': 'Other',
'turnCalls.completed': 'Completed',
'turnCalls.unknown': 'Unknown status',
'turnCalls.loading': 'Loading this turn’s call records…',
'turnCalls.loadError': 'Could not load all call records for this turn.',
'turnCalls.indexError': 'Could not refresh the prompt list.',
'turnCalls.unresolved':
'Could not locate this prompt in the session history. Try refreshing.',
'turnCalls.running': 'Running',
'turnCalls.pending': 'Pending',
'turnCalls.cancelled': 'Cancelled',
'turnCalls.filter': 'Filter by tool type',
'turnCalls.prompt': 'Prompt',
'turnCalls.refresh': 'Refresh',
'turnCalls.all': 'All tools',
'help.subcommands': 'subcommands',
'help.tab.commands': 'Built-in commands',
'help.tab.custom': 'custom-commands',
'help.tab.general': 'shortcuts',
'help.title': 'Help',
'slash.category.custom': 'Custom commands',
'slash.category.skill': 'Skill commands',
'slash.category.system': 'System commands',
'language.changed': (v) => `UI language changed to ${v?.language ?? ''}`,
'language.current': (v) => `Current UI language: ${v?.language ?? ''}`,
'language.invalid': 'Invalid language. Available: en, zh-CN',
'language.options': 'Available options:',
'language.set': 'Set UI language',
'language.usage': 'Usage: /language ui [en|zh-CN]',
'localCommand.noSession':
'No active session yet. Send your first message before using this command.',
'localCommand.diffNoWorkspace':
'No workspace is available yet to show changes for.',
'localCommand.logNoWorkspace':
'No workspace is available yet to show history for.',
'localCommand.prsNoWorkspace':
'No workspace is available yet to show pull requests for.',
'localCommand.prsUnsupported':
'This daemon does not support listing pull requests.',
'local.agents': 'Manage subagents',
'local.bug': 'Submit a bug report',
'local.compress': 'Compress the context into a summary',
'local.compressFast': 'Fast context compression without AI',
'local.config': 'Get or set any setting by dot-path key',
'local.diff': 'Show working-tree change stats versus HEAD',
'local.log': 'Show commit history for the workspace',
'local.prs': 'Show open GitHub pull requests for the workspace',
'local.directory': 'Manage workspace directories',
'local.docs': 'Open the full Qwen Code documentation',
'local.doctor': 'Run installation and environment diagnostics',
'local.dream': 'Consolidate managed auto-memory topic files',
'local.effort': 'Set reasoning effort for capable models',
'local.export': 'Export the current session history to a file',
'local.forget': 'Remove matching entries from managed auto-memory',
'local.hooks': 'Manage Qwen Code hooks',
'local.importConfig': 'Import MCP servers from Claude configs',
'local.init': 'Analyze the project and create a QWEN.md file',
'local.insight': 'Generate programming insights from chat history',
'local.lsp': 'Show LSP server status',
'local.remember': 'Save a durable memory to the memory system',
'local.summary': 'Generate a project summary file',
'local.workflows':
'List workflow runs or cooperatively pause/resume a live run',
'skilldesc.batch': 'Run batch operations across many files in parallel',
'skilldesc.dataviz': 'Design guidance for charts and data visualizations',
'skilldesc.extensionCreator':
'Create, test, and customize Qwen Code extensions',
'skilldesc.goalDraft':
'Turn a fuzzy intention into a verifiable /goal objective',
'skilldesc.loop': 'Run a prompt on a schedule or self-paced wakeups',
'skilldesc.newApp': 'Workflow for building a new app from scratch',
'skilldesc.qcHelper': 'Answer questions about using Qwen Code',
'skilldesc.review': 'Review changed code for bugs, security, and quality',
'skilldesc.simplify': 'Clean up recent changes for reuse and simplicity',
'skilldesc.stuck': 'Diagnose frozen or slow Qwen Code sessions',
'skilldesc.agentReproduceAlign':
'Align a ported Codex/Claude Code feature with the original',
'skilldesc.agentReproduceFeature':
'Reproduce an existing Codex/Claude Code feature',
'skilldesc.autofix':
'Review and fix local changes or run repository Autofix workflows',
'skilldesc.bugfix': 'Fix a bug from a GitHub issue, reproduce-first',
'skilldesc.codegraph': 'Analyze the codebase via graph and vector index',
'skilldesc.createIssue': 'Draft and submit a GitHub issue from an idea',
'skilldesc.docsAuditAndRefresh':
'Audit and refresh docs/ against the codebase',
'skilldesc.docsUpdateFromDiff': 'Update official docs from local git diff',
'skilldesc.e2eTesting': 'Run end-to-end tests of the Qwen Code CLI',
'skilldesc.featDev': 'End-to-end workflow for a non-trivial feature',
'skilldesc.memoryLeakDebug': 'Diagnose CLI memory leaks via heap snapshots',
'skilldesc.preparePr': 'Prepare a GitHub PR title and body from the branch',
'skilldesc.qwenCodeClaw': 'Use Qwen Code as a code-understanding agent',
'skilldesc.structuredDebugging':
'Hypothesis-driven methodology for hard bugs',
'skilldesc.terminalCapture': 'Automate terminal UI screenshot testing',
'skilldesc.tmuxRealUserTesting': 'Real-user testing with tmux, saving logs',
'skilldesc.triage': 'Triage and review Qwen Code issues and PRs',
'local.approvalMode': 'Change approval mode',
'local.auth': 'Connect an LLM provider',
'auth.title': 'Connect a Provider',
'auth.step.group': 'Type',
'auth.step.provider': 'Provider',
'auth.step.protocol': 'Protocol',
'auth.step.api': 'API',
'auth.step.baseUrl': 'Base URL',
'auth.step.apiKey': 'API Key',
'auth.step.models': 'Model IDs',
'auth.step.advanced': 'Advanced Config',
'auth.protocol.openai': 'OpenAI-compatible',
'auth.protocol.openaiDesc': 'Standard OpenAI API format (most common)',
'auth.protocol.anthropic': 'Anthropic-compatible',
'auth.protocol.anthropicDesc': 'Anthropic Messages API format',
'auth.protocol.gemini': 'Gemini-compatible',
'auth.protocol.geminiDesc': 'Google Gemini API format',
'auth.api.chatCompletions': 'Chat Completions',
'auth.api.responses': 'Responses',
'auth.apiKeyRequired': 'API key cannot be empty.',
'auth.baseUrlInvalid': 'Base URL must start with http:// or https://.',
'auth.baseUrlPrompt': 'Enter the API endpoint for this protocol.',
'auth.baseUrlRequired': 'Base URL cannot be empty.',
'auth.documentation': 'Documentation',
'auth.modelsRequired': 'Model IDs cannot be empty.',
'auth.review': 'Review',
'auth.reviewText': 'Review the connection and model settings before saving.',
'auth.save': 'Save',
'auth.saving': 'Saving...',
'auth.termsTitle': 'Terms of Services and Privacy Notice',
'auth.continue': 'Continue',
'auth.modelsPrompt': (v) =>
`Enter model IDs separated by commas. Examples: ${v?.modelIds ?? ''}`,
'auth.advanced.prompt': 'Optional: configure advanced generation settings.',
'auth.advanced.thinking': 'Enable thinking',
'auth.advanced.thinkingDesc':
'Enable extended reasoning. Leave off to use the model default.',
'auth.advanced.modality': 'Enable modality',
'auth.advanced.modalityDesc':
'Enables multimodal input capabilities (image, video, etc.).',
'auth.advanced.modalityImage': 'Image',
'auth.advanced.modalityVideo': 'Video',
'auth.advanced.modalityAudio': 'Audio',
'auth.advanced.modalityPdf': 'PDF',
'auth.advanced.contextWindow': 'Context window',
'auth.advanced.contextDesc':
'Context window capacity in tokens. Leave empty to infer the limit from the model ID.',
'auth.advanced.contextPlaceholder': 'Context window (optional)',
'auth.advanced.maxTokens': 'Maximum output tokens',
'auth.advanced.maxTokensDesc':
'Maximum tokens per response. Leave empty to infer the limit from the model ID.',
'auth.advanced.tokenLimitInvalid': (v) =>
`${v?.field ?? 'Token limit'} must be a whole number between 1 and 10,000,000.`,
'auth.advanced.modalitiesRequired':
'Select at least one input type or turn off modality.',
'auth.advanced.defaults': 'Use model defaults',
'auth.apiKeySet': 'Set (hidden)',
'local.btw':
'Ask a quick side question without affecting the main conversation. Usage: /btw <your question>',
'btw.empty': 'Please provide a question. Usage: /btw <your question>',
'btw.side.empty':
'Please provide a question. Usage: /btw side <your question>',
'btw.emptyAnswer': 'No response received.',
'btw.failed': 'Failed to answer btw question',
'btw.answering': '+ Answering...',
'btw.shortcuts.pending': 'Press Escape, Ctrl+C, or Ctrl+D to cancel',
'btw.shortcuts.done': 'Press Space, Enter, or Escape to dismiss',
'local.clear':
'Start a new session with empty context; previous session stays on disk (resumable with /resume)',
'local.context':
'Show context window usage breakdown. Use "/context detail" for per-item breakdown.',
'local.copy': 'Copy last output or snippet',
'local.delete': 'Delete a session permanently',
'local.release': 'Release a live session',
'local.rewind': 'Rewind the current conversation',
'local.branch': 'Fork the current conversation into a new session',
'local.fork': 'Start a background agent from this conversation',
'local.help': 'Show help and commands',
'local.language': 'Change UI language',
'local.mcp': 'Manage MCP servers',
'local.memory': 'Manage memory',
'local.model': 'Switch model or set fast model',
'local.new': 'Start a new conversation',
'local.plan': 'Enter Plan mode',
'local.goal': 'Set a goal and keep working until it is met',
'local.recap': 'Generate a session recap',
'recap.label': 'Recap',
'recap.loading': 'Generating recap...',
'recap.empty': 'Not enough conversation context for a recap yet.',
'recap.failed': 'Failed to generate recap',
'rewind.action': 'Rewind',
'rewind.confirm': 'Confirm rewind',
'rewind.empty': 'No rewind snapshots are available for this session.',
'rewind.failed': (v) => `Failed to rewind session: ${v?.reason ?? ''}`,
'rewind.loading': 'Loading rewind snapshots...',
'rewind.promptFallback': (v) => `Prompt ${v?.id ?? ''}`,
'rewind.rewinding': 'Rewinding...',
'rewind.subtitle': 'Only the conversation is rewound. Files are not changed.',
'rewind.title': 'Rewind Conversation',
'rewind.turn': (v) => `Prompt ${v?.turn ?? 0}`,
'local.rename': 'Rename current session',
'rename.empty':
'Please enter a session name, for example /rename project debugging, or use /rename --auto.',
'rename.success': (v) => `Session renamed to ${v?.name ?? ''}`,
'local.reset': 'Reset current conversation',
'local.resume': 'Resume a previous session',
'local.skills': 'View available skills',
'local.stats': 'Show session statistics',
'local.tasks': 'View background tasks',
'local.status': 'Show version info',
'local.theme': 'Change theme',
'local.settings': 'View and edit settings',
'local.schedule': 'Manage scheduled tasks',
'local.extensions':
'Manage extensions. Usage: /extensions manage|install <source>',
'extensions.label': 'extension',
'extensions.action.failed': (v) =>
`Extension action failed${
v?.name ? ` for "${v.name}"` : v?.source ? ` from "${v.source}"` : ''
}: ${v?.error ?? 'Unknown error'}`,
'extensions.commands.refreshFailed': 'Failed to refresh extension commands.',
'extensions.install.failed': (v) =>
`Failed to install extension${
v?.source ? ` from "${v.source}"` : ''
}: ${v?.error ?? 'Unknown error'}`,
'extensions.manage.agents': 'Agents:',
'extensions.manage.actions': 'Extension actions',
'extensions.manage.add': 'Add',
'extensions.manage.checkingUpdates': 'Checking for updates...',
'extensions.manage.checkUpdates': 'Check for updates',
'extensions.manage.commands': 'Commands:',
'extensions.manage.contextFiles': 'Context files:',
'extensions.manage.count': (v) => `${v?.count ?? 0} extensions installed`,
'extensions.manage.setting.disabled': 'Disabled',
'extensions.manage.setting.default': 'Default',
'extensions.manage.setting.enabled': 'Enabled',
'extensions.manage.setting.unknown': 'Unavailable',
'extensions.manage.setting.unavailableDescription':
'The service did not return scoped extension settings. Restart qwen serve and try again.',
'extensions.manage.userSetting': 'Global setting',
'extensions.manage.userSettingDescription':
'Applies to your workspaces unless a workspace setting overrides it.',
'extensions.manage.workspaceSetting': 'Workspace setting',
'extensions.manage.workspaceSettingDescription':
'Applies only to the current workspace.',
'extensions.manage.disable': 'Disable Extension',
'extensions.manage.disabled': (v) =>
`Extension "${v?.name ?? 'extension'}" disabled.`,
'extensions.manage.disabling': (v) =>
`Disabling extension "${v?.name ?? 'extension'}"…`,
'extensions.manage.inherited': (v) =>
`Extension "${v?.name ?? 'extension'}" now uses the global setting.`,
'extensions.manage.inheriting': (v) =>
`Resetting extension "${v?.name ?? 'extension'}" to the global setting…`,
'extensions.manage.empty': 'No extensions installed.',
'extensions.manage.emptyAgents': 'This extension has no agents.',
'extensions.manage.emptyCommands': 'This extension has no commands.',
'extensions.manage.emptyContextFiles': 'This extension has no context files.',
'extensions.manage.emptyDescription':
'Install an extension to add commands, skills, agents, or MCP servers.',
'extensions.manage.emptyMcpServers': 'This extension has no MCP servers.',
'extensions.manage.emptySkills': 'This extension has no skills.',
'extensions.manage.enable': 'Enable Extension',
'extensions.manage.enabled': (v) =>
`Extension "${v?.name ?? 'extension'}" enabled.`,
'extensions.manage.enabling': (v) =>
`Enabling extension "${v?.name ?? 'extension'}"…`,
'extensions.manage.install': 'Install',
'extensions.manage.installDescription':
'Enter a GitHub, Git, or npm source, or upload an Extension archive.',
'extensions.manage.sourceTab': 'Source',
'extensions.manage.archiveTab': 'Archive',
'extensions.manage.archiveSelect': 'Select a .zip or .tar.gz archive.',
'extensions.manage.archiveSelected': (v) =>
`Selected archive: ${v?.name ?? 'extension archive'}`,
'extensions.manage.archiveTooLarge':
'Extension archives must be 10 MB or smaller.',
'extensions.manage.archiveEmpty': 'The selected Extension archive is empty.',
'extensions.manage.archiveInvalid':
'Select a .zip or .tar.gz Extension archive with a valid filename up to 255 bytes.',
'extensions.manage.installSelectPluginDescription': (v) =>
`Choose a plugin from "${v?.marketplace ?? 'this marketplace'}".`,
'extensions.manage.installTitle': 'Add Extension',
'extensions.manage.installType': 'Install type:',
'extensions.manage.mcpServers': 'MCP servers:',
'extensions.manage.marketplaceRoot': 'Marketplace root',
'extensions.manage.name': 'Name:',
'extensions.manage.notUpdatable': 'not updatable',
'extensions.manage.operationFailed': 'Extension operation failed.',
'extensions.manage.noDescription': 'No description',
'extensions.manage.noMatches': 'No matching extensions.',
'extensions.manage.origin': 'Origin:',
'extensions.manage.overview': 'Overview',
'extensions.manage.path': 'Path:',
'extensions.manage.queued': (v) =>
`Extension action queued for "${v?.name ?? 'extension'}".`,
'extensions.manage.refreshFailed': (v) =>
`Extension action succeeded, but session refresh failed${
v?.error ? `: ${v.error}` : '.'
}`,
'extensions.manage.restartRequired': 'updated; restart required',
'extensions.manage.search': 'Search extensions…',
'extensions.manage.selectExtension': 'Choose an extension',
'extensions.manage.settings': 'Settings:',
'extensions.manage.skills': 'Skills:',
'extensions.manage.source': 'Source:',
'extensions.manage.sourcePlaceholder': 'https://github.com/owner/repository',
'extensions.manage.status': 'Status:',
'extensions.manage.status.disabled': 'disabled',
'extensions.manage.status.enabled': 'enabled',
'extensions.manage.title': 'Manage Extensions',
'extensions.manage.unknownUpdate': 'unknown',
'extensions.manage.uninstalled': (v) =>
`Extension "${v?.name ?? 'extension'}" uninstalled.`,
'extensions.manage.uninstalling': (v) =>
`Uninstalling extension "${v?.name ?? 'extension'}"…`,
'extensions.manage.uninstallAction': 'Uninstall Extension',
'extensions.manage.uninstallConfirm': (v) =>
`Uninstall extension "${v?.name ?? 'extension'}"?`,
'extensions.manage.upToDate': 'up to date',
'extensions.manage.update': 'Update Extension',
'extensions.manage.updateAvailable': 'update available',
'extensions.manage.updateError': 'update check failed',
'extensions.manage.updateComplete': 'updated',
'extensions.manage.updatedWithWarnings': 'updated with warnings',
'extensions.manage.updateStatus': 'Update status:',
'extensions.manage.updating': 'updating…',
'extensions.manage.updatingExtension': (v) =>
`Updating extension "${v?.name ?? 'extension'}"…`,
'extensions.manage.updated': (v) =>
`Extension "${v?.name ?? 'extension'}" updated.`,
'extensions.manage.updatedWithVersion': (v) =>
`Extension "${v?.name ?? 'extension'}" updated to v${v?.version ?? ''}.`,
'extensions.manage.version': 'Version:',
'extensions.manage.viewDetails': 'View Details',
'extensions.install.installed': (v) =>
`Extension "${v?.name ?? 'extension'}" installed.`,
'extensions.install.installedWithVersion': (v) =>
`Extension "${v?.name ?? 'extension'}" v${v?.version ?? ''} installed.`,
'extensions.install.missingOptionValue': (v) =>
`Missing value for ${v?.option ?? 'option'}`,
'extensions.install.requestFailed': 'Failed to install extension',
'extensions.install.started': (v) =>
`Installing extension from "${v?.source ?? ''}"...`,
'extensions.install.unknownOption': (v) =>
`Unknown option ${v?.option ?? ''}`,
'extensions.install.usage': 'Usage: /extensions manage|install <source>',
'extensions.install.waitForSession':
'Wait for the session to connect before installing an extension.',
'local.tools': 'List available tools. Usage: /tools [desc]',
'loadWarning.commands':
'Failed to load command list; slash commands may be incomplete.',
'loadWarning.context':
'Failed to load session context; current mode may be inaccurate.',
'loadWarning.models':
'Failed to load model list; some model details may be unavailable.',
'mcp.action.auth': 'Authenticate',
'mcp.action.authHint': 'Not exposed by daemon yet',
'mcp.action.authMessage':
'Daemon serve does not expose MCP authentication yet.',
'mcp.action.clearAuth': 'Clear Authentication',
'mcp.action.disable': 'Disable',
'mcp.action.done': (v) => `${v?.action ?? 'Action'} complete.`,
'mcp.action.enable': 'Enable',
'mcp.action.enableMessage':
'Daemon serve does not expose MCP enable/disable yet.',
'mcp.action.failed': (v) => `Failed: ${v?.error ?? ''}`,
'mcp.action.running': (v) => `${v?.action ?? 'Action'}...`,
'mcp.action.reauth': 'Re-authenticate',
'mcp.action.approve': 'Approve',
'mcp.actions': 'Server actions',
'mcp.annotation.destructive': 'destructive',
'mcp.annotation.idempotent': 'idempotent',
'mcp.annotation.openWorld': 'open-world',
'mcp.annotation.readOnly': 'read-only',
'mcp.annotations': 'Annotations',
'mcp.oauth.server': 'Server',
'mcp.oauth.starting': (v) =>
`Starting OAuth authentication for MCP server '${v?.name ?? ''}'...`,
'mcp.oauth.title': 'OAuth Authentication',
'mcp.oauth.timeout': 'Authentication timed out. Refresh to check the status.',
'mcp.oauth.authenticationFailed': 'Authentication failed.',
'mcp.oauth.statusFailed': 'Failed to check the authentication status.',
'mcp.oauth.serverRemoved':
'The MCP server was removed during authentication.',
'mcp.clientBudget': (v) =>
`${v?.count ?? 0}/${v?.budget ?? 0} clients · ${v?.mode ?? 'off'}`,
'mcp.command': 'Command',
'mcp.description': 'Description:',
'mcp.descriptionTitle': 'Description',
'mcp.basicInfo': 'Basic Information',
'mcp.action.reconnect': 'Reconnect',
'mcp.action.edit': 'Edit',
'mcp.reconnect.skipped': (v) =>
`Reconnect was not completed: ${v?.reason ?? 'unknown reason'}.`,
'mcp.reconnect.authenticationRequired':
'Authentication is required before reconnecting.',
'mcp.action.restart': 'Restart',
'mcp.action.tools': 'View tools',
'mcp.action.toolsHint': 'Enter to inspect',
'mcp.empty': 'No MCP servers configured.',
'mcp.emptyDescription': 'Add an MCP server to manage it here.',
'mcp.emptyTools': 'No tools discovered.',
'mcp.expand': 'Expand MCP server',
'mcp.collapse': 'Collapse MCP server',
'mcp.inputSchema': 'Input schema',
'mcp.loadingStatus': 'Loading MCP status...',
'mcp.loadingTools': 'Loading tools...',
'mcp.name': 'Name',
'mcp.noDescription': 'No description',
'mcp.noMatches': 'No matching MCP servers.',
'mcp.add.button': 'Add',
'mcp.add.adding': 'Adding MCP Server…',
'mcp.add.title': 'Add MCP Server',
'mcp.add.description':
'Save an MCP server to this workspace with a name and configuration.',
'mcp.add.name': 'Name',
'mcp.add.serverDescription': 'Description',
'mcp.add.serverDescriptionPlaceholder': 'Describe this MCP server',
'mcp.add.scope': 'Location',
'mcp.add.scope.global': 'Global',
'mcp.add.nameRequired': 'Enter an MCP server name.',
'mcp.add.config': 'Configuration (JSON)',
'mcp.add.configInvalid': 'Configuration must be a JSON object.',
'mcp.add.done': (v) => `Added ${v?.name ?? 'MCP server'}.`,
'mcp.edit.title': 'Edit MCP Server',
'mcp.edit.description':
'Update the description or configuration. Name and location cannot be changed.',
'mcp.edit.save': 'Save Changes',
'mcp.edit.saving': 'Saving Changes…',
'mcp.edit.done': (v) => `Updated ${v?.name ?? 'MCP server'}.`,
'mcp.edit.notFound': 'The MCP server is no longer present in settings.',
'mcp.runtime.notUpdated':
'Configuration was saved, but the current session was not updated.',
'mcp.runtime.removeNotUpdated':
'Configuration was deleted, but the current session was not updated.',
'mcp.discovery.empty': 'No MCP servers are configured.',
'mcp.discovery.timeout':
'MCP discovery is taking longer than expected. Refresh to check again.',
'mcp.add.settingsUnavailable': 'Workspace settings are unavailable.',
'mcp.action.remove': 'Delete',
'mcp.remove.title': 'Delete MCP Server',
'mcp.remove.description': (v) =>
`Remove MCP server “${v?.name ?? ''}” from this workspace?`,
'mcp.remove.description.global': (v) =>
`Remove MCP server “${v?.name ?? ''}” from global settings?`,
'mcp.remove.done': (v) => `Deleted ${v?.name ?? 'MCP server'}.`,
'mcp.remove.notWorkspace':
'This MCP server is not defined in workspace settings.',
'mcp.source.all': 'All',
'mcp.noSchema': 'No input schema.',
'mcp.oauth.open': 'Open authentication page',
'mcp.serverTool': 'Server tool',
'mcp.servers': (v) => `${v?.count ?? 0} servers`,
'mcp.configuredServers': 'Configured MCP servers:',
'mcp.fromExtension': (v) => `(from ${v?.name ?? ''})`,
'mcp.extensionMcp': 'Extension MCP',
'mcp.invalidReason': (v) => `invalid: ${v?.reason ?? ''}`,
'mcp.invalidReasonLabel': 'Reason:',
'mcp.invalidToolHelp':
'Tools must have both name and description to be used by the LLM.',
'mcp.invalidToolWarning': 'Warning: This tool cannot be called by the LLM',
'mcp.manageServers': 'Manage MCP servers',
'mcp.viewDetails': 'View details',
'mcp.parameters': 'Parameters:',
'mcp.required': ' required',
'mcp.resources': 'Resources',
'mcp.resourcesUnavailable': 'Resource details unavailable.',
'mcp.noResources': 'No resources.',
'mcp.resourceCount': (v) =>
`${v?.count ?? 0} ${v?.count === 1 ? 'resource' : 'resources'}`,
'mcp.promptCount': (v) =>
`${v?.count ?? 0} ${v?.count === 1 ? 'prompt' : 'prompts'}`,
'mcp.resource.uriLabel': 'URI:',
'mcp.resource.nameLabel': 'Name:',
'mcp.resource.mimeTypeLabel': 'MIME Type:',
'mcp.resource.sizeLabel': 'Size:',
'mcp.resource.bytes': (v) =>
`${v?.count ?? 0} ${v?.count === 1 ? 'byte' : 'bytes'}`,
'mcp.scrollPosition': (v) => `${v?.current ?? 0}/${v?.total ?? 0}`,
'mcp.shortcut.back': 'Esc to back',
'mcp.shortcut.close': 'Esc to close',
'mcp.shortcut.selectBack': '↑↓ to navigate · Enter to select · Esc to back',
'mcp.shortcut.selectClose': '↑↓ to navigate · Enter to select · Esc to close',
'mcp.settings': 'Settings',
'mcp.extension': (v) => `Extension: ${v?.name ?? ''}`,
'mcp.starting': (v) =>
`⏳ MCP servers are starting up (${v?.count ?? 0} initializing)...`,
'mcp.startingNote':
'Note: First startup may take longer. Tool availability will update automatically.',
'mcp.restartSkipped': (v) => `Skipped ${v?.name ?? ''}: ${v?.reason ?? ''}`,
'mcp.restarted': (v) => `Restarted ${v?.name ?? ''} in ${v?.duration ?? 0}ms`,
'mcp.restartEntries': (v) =>
`Restarted ${v?.restarted ?? 0}/${v?.total ?? 0} ${v?.name ?? ''} entries${v?.failedReasons ? ` (failed: ${v.failedReasons})` : ''}`,
'mcp.source': 'Source',
'mcp.source.extension': 'Extension',
'mcp.source.project': 'Project MCP (.mcp.json)',
'mcp.source.workspace': 'Workspace Settings',
'mcp.source.user': 'Global Settings',
'mcp.status': 'Status',
'mcp.status.blocked': 'Blocked',
'mcp.status.authenticating': 'Authenticating',
'mcp.status.authenticationFailed': 'Authentication failed',
'mcp.status.needsAuthentication': 'Needs authentication',
'mcp.status.needsApproval': 'Needs approval',
'mcp.status.rejected': 'Rejected',
'mcp.status.connected': 'connected',
'mcp.status.connecting': 'connecting',
'mcp.status.disconnected': 'disconnected',
'mcp.status.disconnectedTitle': 'Disconnected',
'mcp.status.disabled': 'disabled',
'mcp.status.ready': 'Ready',
'mcp.status.starting': 'Starting... (first startup may take longer)',
'mcp.status.unknown': 'unknown',
'mcp.tipDesc': 'to show server and tool descriptions',
'mcp.tipNodesc': 'to hide descriptions',
'mcp.tipSchema': 'to show tool parameter schemas',
'mcp.tips': '💡 Tips:',
'mcp.toolCount': (v) => `${v?.count ?? 0} tool`,
'mcp.toolsCount': (v) => `${v?.count ?? 0} tools`,
'mcp.toolsLabel': 'Tools:',
'mcp.title': 'MCP Servers',
'mcp.toolDetail': 'Tool Detail',
'mcp.tools': 'Tools',
'mcp.toolsForServer': (v) => `Tools for ${v?.name ?? 'Server'}`,
'mcp.transport': 'Transport Protocol',
'mcp.use': 'Use',
'mcp.userMcp': 'Global MCP',
'mcp.workingDirectory': 'Working Directory',
'goal.aborted': 'Goal aborted',
'goal.blocked': 'Goal blocked',
'goal.usageLimited': 'Goal usage limited',
'goal.paused': 'Goal paused',
'goal.achieved': 'Goal achieved',
'goal.check': 'Goal check',
'goal.cleared': 'Goal cleared',
'goal.failed': 'Goal could not be achieved',
'goal.judge': 'Judge',
'goal.label': 'Goal',
'goal.lastCheck': 'Last check',
'goal.notYetMet': 'not yet met',
'goal.set': 'Goal set',
'goal.statusActive': '/goal active',
'goal.status.active': 'In progress',
'goal.status.paused': 'Paused',
'goal.status.blocked': 'Blocked',
'goal.status.usage_limited': 'Usage limited',
'goal.status.complete': 'Complete',
'goal.activity.idle': 'Waiting',
'goal.activity.running': 'Working',
'goal.activity.verifying': 'Verifying',
'goal.edit': 'Edit goal',
'goal.pause': 'Pause goal',
'goal.resume': 'Resume goal',
'goal.turn': (v) => `${v?.count ?? 0} turn`,
'goal.turnLabel': (v) => `turn ${v?.count ?? 0}`,
'goal.turns': (v) => `${v?.count ?? 0} turns`,
'goal.turnsOfBudget': (v) =>
`${v?.count ?? 0} / ${v?.budget ?? 0} ${v?.budget === 1 ? 'turn' : 'turns'}`,
'goal.activeOfBudget': (v) => `${v?.used ?? ''} / ${v?.budget ?? ''}`,
'goal.tokens': (v) => `${v?.used ?? 0} tokens`,
'goal.tokensOfBudget': (v) => `${v?.used ?? 0} / ${v?.budget ?? 0} tokens`,
'goals.title': 'Goals',
'goals.subtitle':
'A goal keeps its session working until the condition is met. Only sessions that are currently loaded appear here — a goal advances only while its session is running.',
'goals.loading': 'Loading goals…',
'goals.count': (v) =>
`${v?.count ?? 0} active ${Number(v?.count) === 1 ? 'goal' : 'goals'}`,
'goals.empty': 'No active goals. Set one with /goal <condition>.',
'goals.refresh': 'Refresh',
'goals.new': 'New goal',
'goals.newHint':
'The goal starts in a new session and runs until its condition holds. For an enforced turn or time ceiling, run /config model.goalMaxTurns=20 or /config model.goalMaxActiveMinutes=30 in the chat; it applies after the daemon restarts, to Goals created afterwards.',
'goals.condition': 'Condition',
'goals.conditionPlaceholder':
'e.g. `npm test` exits 0 and `npm run lint` reports no warnings (paste the output); do not modify test files; as model guidance, stop as blocked after 20 turns',
'goals.cancel': 'Cancel',
'goals.create': 'Set goal',
'goals.creating': 'Starting…',
'goals.saving': 'Saving…',
'goals.save': 'Save',
'goals.edit': 'Edit goal',
'goals.objective': 'Objective',
'goals.clear': 'Clear goal',
'goals.clearConfirm': (v) => `Clear the goal "${v?.condition ?? ''}"?`,
'goals.running': 'Working',
'goals.idle': 'Waiting',
'goals.dropped': (v) =>
`${v?.count ?? 0} session${Number(v?.count) === 1 ? '' : 's'} could not be reached — any goals they are running are missing from this list.`,
'goals.notYetEvaluated': 'not yet evaluated',
'goals.openSessionHint': "Open this goal's session",
'goals.error.emptyCondition': 'Enter a condition for the goal.',
'goals.error.clearKeyword': (v) =>
`"${v?.word ?? ''}" clears a goal rather than setting one. Describe the condition to work toward.`,
'goals.error.createFailed': 'Failed to start the goal',
'goals.error.saveFailed': 'Failed to save the goal',
'goals.error.goalUnavailable': 'The goal is no longer available.',
'goals.error.requiresObjective': (v) =>
`/goal ${v?.keyword ?? 'set'} requires an objective.`,
'goals.error.invalidCommand': 'Invalid /goal command',
'goals.error.goalsUnavailable':
'The goals view is not available on this surface.',
'goals.error.attachmentsUnsupported':
'Remove attachments before using /goal.',
'goals.error.editFailed': 'Failed to edit the goal',
'goals.error.pauseFailed': 'Failed to pause the goal',
'goals.error.resumeFailed': 'Failed to resume the goal',
'goals.error.clearFailed': 'Failed to clear the goal',
'goals.error.controlBusy':
'Another goal control is still running. Try again once it finishes.',
'memory.add': 'Add',
'memory.add.desc': 'Write a durable memory',
'memory.autoDream': (v) =>
`Auto-dream: ${v?.status ?? 'unknown'} · ${v?.lastDream ?? 'never'} · /dream to run`,
'memory.autoDreamUnsupported':
'Auto-dream settings are not available from web-shell yet.',
'memory.autoFolder': 'Open auto-memory folder',
'memory.autoMemory': (v) => `Auto-memory: ${v?.status ?? 'unknown'}`,
'memory.autoMemoryUnsupported':
'Auto-memory settings are not available from web-shell yet.',
'memory.autoSkill': (v) => `Auto-skill: ${v?.status ?? 'unknown'}`,
'memory.autoSkillUnsupported':
'Auto-skill settings are not available from web-shell yet.',
'memory.chooseScope': 'Choose where to save the memory',
'memory.closed': 'Memory panel closed.',
'memory.contentEmpty': 'Memory content is empty.',
'memory.file': 'Memory file',
'memory.fileOpen': 'Memory file opened.',
'memory.fileTruncated': 'Memory file opened. Content is truncated.',
'memory.files': 'Memory Files',
'memory.footer': 'Enter to confirm · Esc to cancel',
'memory.footer.back': 'Esc to go back',
'memory.global': 'User',
'memory.global.desc': 'Saved to the global user memory file',
'memory.globalReadUnsupported':
'Global memory is outside the bound workspace, so the current daemon file-read API cannot open its content.',
'memory.loading': 'Loading memory...',
'memory.loadingFile': 'Loading memory file...',
'memory.lastDream': '5 hours ago',
'memory.menu': 'Memory',
'memory.never': 'never',
'memory.noFiles': 'No memory files found.',
'memory.on': 'on',
'memory.openFolderUnsupported':
'Opening the auto-memory folder is not available from web-shell yet.',
'memory.placeholder': (v) => `Write ${v?.scope ?? 'memory'} content...`,
'memory.project': 'Project',
'memory.project.desc': 'Saved to this workspace memory file',
'memory.refresh': 'Refresh',
'memory.refresh.desc': 'Reload memory file information',
'memory.refreshed': 'Memory refreshed.',
'memory.save': 'Save Memory',
'memory.savedIn': (v) => `Saved in ${v?.path ?? ''}`,
'memory.saved': (v) =>
`${v?.scope ?? 'Memory'} saved: ${v?.bytes ?? 0} bytes -> ${v?.path ?? ''}`,
'memory.saving': 'Saving...',
'memory.show': 'Show',
'memory.show.desc': 'Show configured memory files',
'memory.status': 'Workspace and user memory files',
'memory.unknown': 'unknown',
'memory.write': 'Write memory content',
'mode.auto': 'Classifier Approval',
'mode.auto.desc':
'Uses a classifier to approve safe tool calls and block or ask for risky ones',
'mode.auto.notice':
'Auto mode enabled. An LLM classifier evaluates each tool call and auto-approves safe actions, blocks risky ones. To exit: Shift+Tab or /approval-mode default.',
'mode.footer': '(Use Enter to select, Esc to cancel)',
'mode.name.plan': 'plan',
'mode.name.default': 'default',
'mode.name.auto-edit': 'auto-edit',
'mode.name.auto': 'auto',
'mode.name.yolo': 'yolo',
'plan.toggle.on': 'Plan before executing',
'plan.toggle.off': (v) =>
`Planning; execute with ${v?.mode} after approval. Click to exit planning.`,
'approval.option.executePlan': (v) => `Approve and execute · ${v?.mode}`,
'mode.label.plan': 'Plan',
'mode.label.default': 'Ask Approval',
'mode.label.auto-edit': 'Auto Edit',
'mode.label.auto': 'Classifier Approval',
'mode.label.yolo': 'Full Access',
'mode.listLabel.plan': 'Plan (plan)',
'mode.listLabel.default': 'Ask Approval (default)',
'mode.listLabel.auto-edit': 'Auto Edit (auto-edit)',
'mode.listLabel.auto': 'Classifier Approval (auto)',
'mode.listLabel.yolo': 'Full Access (yolo)',
'mode.desc.plan': 'Analyze only, do not modify files or execute commands',
'mode.desc.default':
'Ask before running commands, editing files, or accessing external resources',
'mode.desc.auto-edit':
'Automatically approve file edits and ask before command execution or other sensitive actions',
'mode.desc.auto':
'Evaluate tool risk automatically, run safe actions, and confirm risky ones',
'mode.desc.yolo': 'Automatically approve all tool calls in trusted contexts',
'mode.select': 'Approval Mode',
'mode.changePending':
'A mode change or plan confirmation is pending. Try again when it finishes.',
'mode.autoApproved': ((v) =>
v?.tool
? `Auto-approved: ${v.tool}`
: 'Pending tool call auto-approved by mode switch.') as MessageValue,
'mode.auto-edit': 'Auto-accept edits',
'mode.auto-edit.desc': 'Automatically approve file read/write operations',
'mode.default': 'Default mode',
'mode.default.desc': 'Ask before each tool call',
'mode.plan': 'Plan mode',
'mode.plan.desc': 'Analyze and plan without running tools',
'mode.unknown': 'unknown mode',
'mode.yolo': 'YOLO mode',
'mode.yolo.desc': 'Automatically approve all operations',
'plan.title': 'Plan',
'model.contextWindow': 'Context Window',
'model.contextWindow.unknown': '(unknown)',
'model.current': (v) => `current: ${v?.model ?? 'unknown'}`,
'model.modality': 'Modality',
'model.modality.text': 'text',
'model.modality.textOnly': 'text-only',
'model.modality.image': 'image',
'model.modality.pdf': 'pdf',
'model.modality.audio': 'audio',
'model.modality.video': 'video',
'model.baseUrl': 'Base URL',
'model.apiKey': 'API Key',
'model.default': '(default)',
'model.notSet': '(not set)',
'model.footer': 'Enter select, ↑↓ navigate, Esc close',
'model.searchHint': 'Press / to search',
'model.fastHint': 'for suggestions and side tasks',
'model.noMatch': (v) => `No model matching "${v?.query ?? ''}"`,
'model.unavailable':
'Models are unavailable; the daemon default will be used.',
'model.none': 'No models available',
'model.select': 'Select Model',
'model.section': 'Model',
'reasoning.options': 'Options',
'reasoning.thinking': 'Thinking',
'reasoning.thinkingOff': 'Thinking Off',
'reasoning.effort': 'Effort',
'reasoning.effort.low': 'Low',
'reasoning.effort.medium': 'Medium',
'reasoning.effort.high': 'High',
'reasoning.effort.xhigh': 'Extra High',
'reasoning.effort.max': 'Max',
'reasoning.updateFailed': 'Failed to update reasoning options',
'model.setFast': 'Set Fast Model',
'model.setVoice': 'Set Voice Model',
'auth.purpose.label': 'Model purpose',
'auth.purpose.chat': 'Conversation',
'auth.purpose.chatHint':
'Use this provider for conversation. The current model is retained when it is included in the configuration.',
'auth.purpose.image': 'Image generation',
'auth.purpose.voice': 'Voice transcription',
'auth.purpose.realtime': 'Live Voice',
'auth.purpose.imageHint':
'Use a DashScope- or MiniMax-compatible HTTPS image-generation endpoint without query or fragment. Adding this model keeps your conversation model.',
'auth.purpose.voiceHint':
'Use OpenAI Chat Completions with qwen3-asr-flash, qwen3-asr-flash-realtime, fun-asr-realtime, or paraformer-realtime. Adding this model keeps your conversation model.',
'model.setAdvisor': 'Set Advisor Model',
'model.setImage': 'Set Image Model',
'model.useMain': 'Use main model',
'model.disabled': 'Disabled',
'model.setVision': 'Set Vision Model',
'model.switch': 'Switch Model',
'model.unknown': 'unknown',
'resume.current': 'current',
'resume.activePrompt': 'active prompt',
'resume.filter': 'Filter',
'resume.noMatch': (v) => `No session matching "${v?.query ?? ''}"`,
'resume.none': 'No sessions to resume',
'resume.pressSearch': 'Press / to search',
'resume.search': 'Search',
'resume.title': 'Resume Session',
'parallelAgents.title': 'Parallel agents',
'parallelAgents.done': (v) => `${v?.done ?? 0}/${v?.total ?? 0} done`,
'parallelAgents.failed': (v) => `${v?.count ?? 0} failed`,
'skills.actions': 'Skill actions',
'skills.disable': 'Disable',
'skills.disableInWorkspace': 'Disable in this workspace',
'skills.disabled': 'Skill disabled.',
'skills.enable': 'Enable',
'skills.enabled': 'Skill enabled.',
'skills.install.action': 'Upload',
'skills.install.description':
'Install a skill from GitHub, a local folder, or a ZIP archive.',
'skills.install.error.authentication':
'Authentication is required to upload skills.',
'skills.install.error.folderRequired': 'Enter a folder path.',
'skills.install.error.githubRequired': 'Enter a GitHub SKILL.md URL.',
'skills.install.error.invalidName':
'The skill name is missing or contains unsupported characters.',
'skills.install.error.manifestMissing':
'The package must contain a SKILL.md file at its root.',
'skills.install.error.invalidPackage':
'The skill package is invalid. Check its structure and SKILL.md content.',
'skills.install.error.zipTooLarge': 'The ZIP file must not exceed 6 MB.',
'skills.install.error.invalidFolder': 'Enter a valid local skill folder.',
'skills.install.error.githubFailed':
'Could not download the skill from GitHub. Check the URL or authentication and try again.',
'skills.install.error.invalidScope':
'Choose either the workspace or global install location.',
'skills.install.error.invalidSource':
'The daemon does not recognize this upload source. Restart the updated daemon and try again.',
'skills.install.error.notFound': 'The requested skill was not found.',
'skills.install.error.nameRequired': 'Enter the skill name.',
'skills.install.error.untrusted':
'Trust this workspace before uploading skills.',
'skills.install.failed': 'Failed to upload skill.',
'skills.install.folder': 'Local folder',
'skills.install.folderPath': 'Folder path',
'skills.install.githubUrl': 'SKILL.md URL',
'skills.install.name': 'Skill name',
'skills.install.scope': 'Install to',
'skills.install.scope.global': 'Global',
'skills.install.scope.workspace': 'Workspace',
'skills.install.selectZip': 'Select a ZIP archive.',
'skills.install.title': 'Upload skill',
'skills.install.succeeded': (v) =>
`Skill “${v?.name ?? ''}” uploaded successfully.`,
'skills.install.zipSelected': (v) => `Selected: ${v?.name ?? ''}`,
'skills.delete.action': 'Delete skill',
'skills.delete.description': (v) =>
`Delete “${v?.name ?? ''}” from disk? This cannot be undone.`,
'skills.delete.failed': 'Failed to delete skill.',
'skills.delete.succeeded': (v) =>
`Skill “${v?.name ?? ''}” deleted successfully.`,
'skills.delete.title': 'Delete skill?',
'skills.empty': 'No skills available.',
'skills.count': (v) =>
[
`${v?.count ?? 0} skills`,
...(v?.enabled ? [`${v.enabled} enabled`] : []),
...(v?.disabled ? [`${v.disabled} disabled`] : []),
].join(', '),
'skills.details': 'Skill details',
'skills.extension': 'Extension',
'skills.filter.all': 'All',
'skills.filter.bundled': 'Built-in',
'skills.filter.extension': 'Extensions',
'skills.filter.label': 'Filter skills by source',
'skills.filter.project': 'Workspace settings',
'skills.filter.status.all': 'All',
'skills.filter.status.disabled': 'Disabled',
'skills.filter.status.enabled': 'Enabled',
'skills.filter.status.label': 'Filter skills by status',
'skills.filter.user': 'Global settings',
'skills.hint': 'Hint',
'skills.invocation': 'Invocation',
'skills.level': 'Scope',
'skills.level.bundled': 'Bundled',
'skills.level.extension': 'Extension',
'skills.level.project': 'Project',
'skills.level.user': 'Global',
'skills.loading': 'Loading skills...',
'skills.manualReference': 'Manual reference',
'skills.manualReferenceHint':
'The model cannot discover this skill automatically. Reference it manually.',
'skills.model': 'Model',
'skills.modelAccess': 'Model access',
'skills.modelAccess.disabled': 'Not model-invocable',
'skills.modelAccess.enabled': 'Model-invocable',
'skills.modelInvocable': 'Model',
'skills.noDescription': 'No description',
'skills.noMatches': 'No matching skills.',
'skills.notToggleable': 'This skill cannot be enabled or disabled.',
'skills.run': 'Reference skill',
'skills.search': 'Search skills…',
'skills.settingUpdated': 'Workspace setting updated.',
'skills.settingUpdatedAvailabilityUnchanged':
'Workspace setting updated. Effective Skill availability did not change.',
'skills.settingUnchanged':
'Skill already has the requested workspace setting; no setting was changed.',
'skills.status': 'Status',
'skills.status.disabled': 'disabled',
'skills.status.enabled': 'enabled',
'skills.toggleFailed': 'Failed to update skill.',
'skills.error.inactiveExtension':
'This skill belongs to an inactive extension. Enable the extension first.',
'skills.toggleUnsupported':
'The connected daemon does not support skill enable or disable actions.',
'skills.title': 'Skills',
'plugins.extensions': 'Extensions',
'plugins.agents': 'Agents',
'plugins.mcp': 'MCP',
'plugins.sections': 'Plugin sections',
'plugins.skills': 'Skills',
'plugins.title': 'Plugins',
'plugins.tools': 'Tools',
'stats.accepted': 'Accepted:',
'stats.agreementRate': 'Overall Agreement Rate:',
'stats.api': 'API',
'stats.apiTime': 'API Time',
'stats.avgDuration': 'Avg Duration',
'stats.avgLatency': 'Avg Latency',
'stats.cached': 'Cached',
'stats.cacheDesc':
'of input tokens were served from the cache, reducing costs.',
'stats.calls': 'Calls',
'stats.codeChanges': 'Code Changes',
'stats.decisionSummary': 'User Decision Summary',
'stats.duration': 'Duration',
'stats.errors': 'Errors',
'stats.inputTokens': 'Input Tokens',
'stats.metric': 'Metric',
'stats.modelStats': 'Model Stats',
'stats.modelTip': 'Tip: For a full token breakdown, run /stats model.',
'stats.modelUsage': 'Model Usage',
'stats.modified': 'Modified:',
'stats.noApiCalls': 'No API calls have been made in this session.',
'stats.noToolCalls': 'No tool calls have been made in this session.',
'stats.outputTokens': 'Output Tokens',
'stats.overview': 'Session Overview',
'stats.performance': 'Performance',
'stats.prompts': 'Prompts',
'stats.rejected': 'Rejected:',
'stats.reqs': 'Reqs',
'stats.requests': 'Requests',
'stats.savingsHighlight': 'Savings Highlight:',
'stats.successRate': 'Success Rate',
'stats.thoughts': 'Thoughts',
'stats.title': 'Session Stats',
'stats.tokens': 'Tokens',
'stats.toolCalls': 'Tool Calls',
'stats.toolName': 'Tool Name',
'stats.toolStats': 'Tool Stats',
'stats.toolTime': 'Tool Time',
'stats.total': 'Total',
'stats.totalReviewed': 'Total Reviewed Suggestions:',
'contextUsage.refresh': 'Refresh',
'contextUsage.remaining': 'Remaining',
'contextUsage.advanced': 'Advanced · usage by category',
'contextUsage.snapshot': 'Snapshot',
'contextUsage.viewCurrent': 'View current context',
'contextUsage.compress': 'Compress context',
'contextUsage.compressing': 'Compressing…',
'contextUsage.compressed': 'Compression completed. Context usage refreshed.',
'contextUsage.compressCancelled':
'Cancellation requested. Refresh to check current usage.',
'contextUsage.compressInterrupted':
'Connection changed during compression. Refresh to check current usage.',
'contextUsage.compressFailed': 'Compression failed. You can try again.',
'contextUsage.compressRefreshFailed':
'Compression completed, but usage could not be refreshed. Use Refresh to retry.',
'contextUsage.compressUnavailable':
'Requires an idle, connected, writable session with the built-in compression command and no active goal.',
'contextCompression.result': (v) =>
`Context compressed ${v?.from ?? ''} → ${v?.to ?? ''}`,
'contextCompression.instructionsTruncated': (v) =>
`Compression instructions were truncated to ${v?.max ?? ''} characters.`,
'contextCompression.noop': 'No compression needed.',
'contextUsage.retry': 'Retry',
'contextUsage.loadError': 'Failed to load context usage.',
'contextUsage.previousReading':
'Could not refresh. Showing a previous reading.',
'contextUsage.unavailable': 'Context usage is unavailable for this session.',
'tokenUsage.avgLatency': 'Avg latency',
'tokenUsage.cached': 'Cached input',
'tokenUsage.input': 'Input',
'tokenUsage.loadError': 'Failed to load token usage.',
'tokenUsage.models': 'By model',
'tokenUsage.noData': 'No API calls in this session yet.',
'tokenUsage.noSubagents': 'No subagent calls in this session yet.',
'tokenUsage.noTools': 'No tool calls in this session yet.',
'tokenUsage.open': 'Session token usage',
'tokenUsage.output': 'Total output',
'tokenUsage.refresh': 'Refresh',
'tokenUsage.requests': 'Requests',
'tokenUsage.retry': 'Retry',
'tokenUsage.subagents': 'Subagents',
'tokenUsage.thoughts': 'Reasoning (included in total output)',
'tokenUsage.title': 'Token Usage',
'tokenUsage.toolRow': (v) =>
`${v?.count ?? 0} calls · ${v?.rate ?? 0}% ok · ${v?.duration ?? ''}`,
'tokenUsage.tools': 'Tools',
'tokenUsage.updatedAt': (v) => `Updated ${v?.time ?? ''}`,
'tokenUsage.unavailable': 'Token usage is unavailable for this session.',
'trajectory.title': 'Trajectory',
'trajectory.description': 'See where a run spent its time and tokens',
'trajectory.empty': 'No records in this session yet.',
'trajectory.noTiming':
'No request or tool durations are recorded for these records.',
'trajectory.truncated':
'Showing the most recent records; earlier history is not loaded.',
'trajectory.loadingPages': (v) =>
`Loading records… (${v?.pages ?? 0} ${Number(v?.pages) === 1 ? 'page' : 'pages'} so far)`,
'trajectory.olderFailed': (v) =>
`Earlier records could not be read: ${v?.message ?? ''}`,
'trajectory.olderPartial':
'Earlier records could only be read in part, so they are left out.',
'trajectory.loadFailed': (v) =>
`Could not read the transcript: ${v?.message ?? ''}`,
'trajectory.partial':
'Part of this transcript could not be read, so some records are missing.',
'trajectory.totals': (v) =>
`Loaded window · ${plural(v?.turns, 'turn')} · ${plural(v?.requests, 'request')} · ${plural(v?.tools, 'tool')}`,
'trajectory.turn': (v) => `Turn ${v?.index ?? 0}`,
'trajectory.turnPartial': (v) => `Turn ${v?.index ?? 0} (continued)`,
'trajectory.turnSummary': (v) =>
`${plural(v?.requests, 'request')} · ${plural(v?.tools, 'tool')} · main model total ${v?.duration ?? ''}`,
'trajectory.request': 'Model request',
'trajectory.requestFailed': 'Request failed',
'trajectory.toolFailed': 'Tool failed',
'trajectory.ttft': (v) => `First token ${v?.duration ?? ''}`,
'trajectory.subagentRollup': (v) =>
`subagent ${plural(v?.requests, 'request')} · ${plural(v?.tools, 'tool')} · ${v?.duration ?? ''}`,
'trajectory.badge.user': 'you',
'trajectory.badge.message': 'say',
'trajectory.badge.thought': 'think',
'trajectory.badge.tool': 'tool',
'trajectory.badge.subagent': 'sub',
'trajectory.badge.shell': 'shell',
'trajectory.badge.permission': 'ask',
'trajectory.badge.status': 'note',
'trajectory.badge.cancelled': 'stop',
'trajectory.badge.other': 'other',
'trajectory.cancelled': 'Turn cancelled',
'trajectory.overview.label': (v) =>
`Timeline of ${plural(v?.spans, 'timed record')}, ${v?.busy ?? ''} of activity`,
'trajectory.overview.busy': (v) => `${v?.duration ?? ''} active`,
'trajectory.range.status': (v) =>
`Visible records ${v?.shown ?? 0} / window records ${v?.total ?? 0} (including context)`,
'trajectory.collapsed': (v) => `${v?.count ?? 0} records collapsed`,
'trajectory.expand': (v) => `Expand ${v?.name ?? ''}`,
'trajectory.collapse': (v) => `Collapse ${v?.name ?? ''}`,
'trajectory.parentUnresolved': 'Parent call not located',
'trajectory.contextRow': 'Context',
'trajectory.inspector.hiddenByCollapse':
'The group containing this record is collapsed.',
'trajectory.reveal': 'Expand and locate',
'trajectory.range.clear': 'Clear time selection',
'trajectory.range.empty': 'No request or tool ran in the selected time.',
'trajectory.mode.clock': 'Real time, idle included',
'trajectory.clock.window': (v) =>
`${v?.elapsed ?? ''} elapsed, ${v?.active ?? ''} active`,
'trajectory.clock.label': (v) =>
`Timeline of ${v?.spans ?? 0} timed records over ${v?.elapsed ?? ''}, ${v?.active ?? ''} of activity`,
'trajectory.clock.status': 'Showing real time, idle included',
'trajectory.active.status': 'Showing active time only',
'trajectory.zoom.in': 'Zoom in',
'trajectory.zoom.out': 'Zoom out',
'trajectory.zoom.reset': 'Show the whole run',
'trajectory.zoom.window': (v) => `${v?.to ?? ''} of ${v?.busy ?? ''}`,
'trajectory.zoom.aria': (v) => `, zoomed to ${v?.from ?? ''}–${v?.to ?? ''}`,
'trajectory.zoom.status': (v) =>
`Showing ${v?.from ?? ''}–${v?.to ?? ''} of ${v?.busy ?? ''}`,
'trajectory.range.aria': (v) =>
`, ${v?.from ?? ''} to ${v?.to ?? ''} selected`,
'trajectory.metric.elapsed': 'Elapsed span',
'trajectory.metric.active': 'Active coverage',
'trajectory.metric.main': 'Main model total',
'trajectory.metric.help': 'Metric definitions',
'trajectory.metric.scope':
'Counts cover projected rows in the loaded window, including loaded subagent records. Selection and zoom do not change them.',
'trajectory.metric.elapsed.help':
'Elapsed span: earliest recorded start to latest end, including gaps; plotted records only.',
'trajectory.metric.active.help':
'Active coverage: time with at least one recorded request or tool running. Parallel time counts once.',
'trajectory.metric.main.help':
'Main model total: sum of main-session model request durations, excluding subagent requests and tools. Failed attempts may count.',
'trajectory.metric.missing.help':
'Unplotted requests and tools remain in the list. An em dash means unrecorded; zero is a measured zero.',
'trajectory.failures': (v) =>
`Failed requests ${v?.requests ?? 0} · failed tools ${v?.tools ?? 0}`,
'trajectory.unrecorded': 'unrecorded',
'trajectory.unplotted': (v) =>
`Unplotted: ${v?.starts ?? 0} without start · ${v?.timing ?? 0} without duration`,
'trajectory.missingStart': (v) =>
`${v?.count ?? 0} timed records have no start`,
'trajectory.missingTiming': (v) => `${v?.count ?? 0} tools have no duration`,
'trajectory.noStart':
'Recorded durations have no start time, so no bars can be plotted.',
'trajectory.refreshStale': 'Refresh failed; showing the last successful read',
'trajectory.selected.label': 'Selected',
'trajectory.selected.none': 'Choose a record',
'trajectory.selected.noTiming': 'no request or tool timing',
'trajectory.inspector.title': 'Record details',
'trajectory.inspector.open': 'View details',
'trajectory.inspector.close': 'Close details',
'trajectory.inspector.selectRecord': 'Select a record to inspect.',
'trajectory.inspector.selectRowInTurn':
'Turn selected. Select a record to inspect.',
'trajectory.inspector.stale':
'The record window changed. Select a record again.',
'trajectory.inspector.hiddenByRange':
'This record is outside the selected time.',
'trajectory.inspector.tab.summary': 'Summary',
'trajectory.inspector.tab.input': 'Input',
'trajectory.inspector.tab.output': 'Output',
'trajectory.inspector.tab.metrics': 'Metrics',
'trajectory.inspector.tab.body': 'Body',
'trajectory.inspector.model': 'Model',
'trajectory.inspector.status': 'Status',
'trajectory.inspector.permissionTitle': 'Title',
'trajectory.inspector.permissionPending': 'pending',
'trajectory.inspector.executionId': 'Execution ID',
'trajectory.inspector.responseId': 'Response ID',
'trajectory.inspector.promptId': 'Prompt ID',
'trajectory.inspector.subagent': 'Subagent',
'trajectory.inspector.parentCall': 'Parent call ID',
'trajectory.inspector.duration': 'Duration',
'trajectory.inspector.start': 'Recorded start',
'trajectory.inspector.end': 'Calculated end',
'trajectory.inspector.ttft': 'First token',
'trajectory.inspector.afterFirst': 'After first token',
'trajectory.inspector.invalidTtft':
'Recorded first-token timing is inconsistent',
'trajectory.inspector.inputTokens': 'Input tokens',
'trajectory.inspector.outputTokens': 'Output tokens',
'trajectory.inspector.cachedTokens':
'Cached input tokens (included in input)',
'trajectory.inspector.tool': 'Tool',
'trajectory.inspector.callId': 'Call ID',
'trajectory.inspector.details': 'Recorded details',
'trajectory.inspector.preview': 'Recorded preview',
'trajectory.inspector.input': 'Recorded input',
'trajectory.inspector.output': 'Recorded output',
'trajectory.inspector.contentFallback':
'Tool content (no separate raw output)',
'trajectory.inspector.body': 'Recorded text',
'trajectory.inspector.kind': 'Kind',
'trajectory.inspector.images': 'Image types',
'trajectory.inspector.files': 'Files',
'trajectory.inspector.resourceLinks': 'Resource links',
'trajectory.inspector.command': 'Command',
'trajectory.inspector.reason': 'Reason',
'trajectory.inspector.truncated': 'Content truncated',
'trajectory.inspector.formatFailed': 'Could not format recorded field',
'trajectory.inspector.expand': 'Show more',
'trajectory.inspector.copy': 'Copy displayed content',
'trajectory.inspector.copied': 'Copied displayed content',
'trajectory.inspector.copyFailed': 'Could not copy content',
'trajectory.mode.group': 'Time scale',
'trajectory.mode.active': 'Active time, idle removed',
'trajectory.mode.active.short': 'Active time',
'trajectory.mode.clock.short': 'Real time',
'trajectory.legend.ttft': 'Main: first token wait',
'trajectory.legend.after': 'After first token',
'trajectory.legend.error': 'Failed',
'trajectory.overview.lane.requests': 'Model requests',
'trajectory.overview.lane.tools': 'Tool calls',
'trajectory.overview.lane.subagents': 'Subagent requests',
'status.contextUsed': (v) => `${v?.pct ?? '0.0'}% context used`,
'status.disconnected': 'Disconnected',
'status.modeHint': '(shift + tab or click to switch)',
'status.shortcuts': '? for shortcuts',
'stream.cancel': 'esc to cancel',
'stream.cancelArmed': 'Press Esc again to stop',
'stream.tokens': (v) => `${v?.count ?? 0} tokens`,
'theme.current': (v) => `current: ${v?.theme ?? ''}`,
'theme.auto': 'Auto',
'theme.dark': 'Dark',
'theme.dark.desc': 'Terminal-style dark skin.',
'theme.light': 'Light',
'theme.light.desc': 'Terminal-style light skin.',
'theme.title': 'Theme',
'todo.allDone': 'All tasks completed',
'todo.collapse': 'Collapse task list',
'todo.completedAbove': (v) => `✓ ${v?.count ?? 0} completed`,
'todo.detail.api': 'API',
'todo.detail.cached': 'Cached',
'todo.detail.end': 'End',
'todo.detail.hide': 'Hide task detail',
'todo.detail.input': 'Input',
'todo.detail.noResources':
"Token & time usage wasn't captured for this task.",
'todo.detail.output': 'Output',
'todo.detail.sectionSpent': 'Time spent',
'todo.detail.sectionTime': 'Time',
'todo.detail.sectionTokens': 'Tokens',
'todo.detail.show': 'Show task detail',
'todo.detail.start': 'Start',
'todo.detail.tool': 'Tool',
'todo.expand': 'Expand task list',
'todo.more': (v) => `... ${v?.count ?? 0} more`,
'todo.moreAbove': (v) => `... ${v?.count ?? 0} earlier`,
'todo.showLess': 'Show less',
'todo.stepProgress': (v) => `Step ${v?.current ?? 0} / ${v?.total ?? 0}`,
'todo.stepFraction': (v) => `${v?.current ?? 0} / ${v?.total ?? 0}`,
'todo.title': 'Current tasks',
'planExecution.dialogTitle': 'Plan & tasks',
'planExecution.title': 'Plan execution',
'planExecution.overview': 'Workflow overview',
'planExecution.overallProgress': 'Overall progress',
'planExecution.stepsCompleted': 'Steps completed',
'planExecution.activeAgents': 'Active agents',
'planExecution.needsAttention': 'Needs attention',
'planExecution.stepDetails': 'Step details',
'planExecution.subagents': 'Subagents',
'planExecution.noSubagents': 'No agent has been linked to this step yet.',
'planExecution.openDetails': 'Open subagent details',
'planExecution.currentActivity': 'Current activity:',
'planExecution.toolCalls': (v) => `${v?.count ?? 0} tool calls`,
'planExecution.tokens': (v) => `${v?.count ?? 0} tokens`,
'planExecution.view': 'View plan execution',
'planExecution.dependsOn': 'Depends on:',
'planExecution.unblocks': 'Unblocks:',
'planExecution.unassigned': 'Unassigned executions',
'planExecution.attention': 'Needs attention',
'planExecution.agentCount': (v) =>
`${v?.count ?? 0} ${Number(v?.count ?? 0) === 1 ? 'agent' : 'agents'}`,
'planExecution.status.running': 'Running',
'planExecution.status.paused': 'Paused',
'planExecution.status.completed': 'Completed',
'planExecution.status.blocked': 'Blocked',
'planExecution.status.in_progress': 'In progress',
'planExecution.status.ready': 'Ready',
'planExecution.edgesHidden': (v) =>
`Too many dependencies to draw (${v?.count ?? 0}). Each step lists what it depends on instead.`,
'workflow.chatTitle': 'Chat',
'workflow.title': 'Workflow',
'workflow.inspector.summary': 'Workflow progress',
'workflow.inspector.selectedStep': 'Selected step',
'workflow.inspector.allSteps': 'Steps',
'workflow.inspector.recentActivity': 'Recent Agent activity',
'workflow.inspector.expandGraph': 'Expand dependency graph',
'workflow.inspector.graphCanvas': 'Dependency graph',
'workflow.inspector.canvasHint':
'Select a graph node to inspect its dependencies and Agent runs here.',
'workflow.inspector.activeAgents': (v) =>
`${v?.count ?? 0} active Agent${v?.count === 1 ? '' : 's'}`,
'workflow.inspector.attentionCount': (v) => `${v?.count ?? 0} need attention`,
'workflow.planReview.title': 'Plan & Review',
'workflow.planReview.question': 'Confirm the plan and start collaboration?',
'workflow.planReview.confirm': 'Confirm and start',
'workflow.planReview.continuePlanning': 'Continue planning',
'workflow.empty.title': 'This session has no structured workflow yet',
'workflow.empty.copy':
'Return to Chat, enter Plan & Review, and ask for Todos with stable IDs and dependencies.',
'workflow.empty.action': 'Return to Chat and create a plan',
'workflow.tabs.attention': 'Needs attention',
'workflow.connection.connected': 'Daemon connected',
'workflow.connection.reconnecting': 'Daemon reconnecting',
'workflow.session.defaultTitle': 'Current Session Workflow',
'workflow.session.workspace': 'workspace',
'workflow.dependencies.upstream': 'Depends on',
'workflow.dependencies.none': 'None',
'workflow.dependencies.unblocks': 'Unblocks',
'workflow.dependencies.noDownstream': 'No downstream steps',
'workflow.activity.empty': 'No Agent runs are linked to a Todo yet.',
'workflow.activity.showAll': (v) => `Show all ${v?.count ?? 0} runs`,
'workflow.deliverables.title': 'Session deliverables',
'workflow.deliverables.none': 'No artifacts have been published yet',
'workflow.status.running': 'Running',
'workflow.status.paused': 'Paused',
'workflow.status.completed': 'Completed',
'workflow.status.failed': 'Failed',
'workflow.status.cancelled': 'Cancelled',
'workflow.task.completed': 'Completed',
'workflow.task.attention': 'Needs attention',
'workflow.task.running': 'Collaboration running',
'workflow.task.waitingExecution': 'Waiting to execute',
'planExecution.locateCurrent': 'Locate current step',
'status.mode': 'Approval mode',
'chat.scrollToBottom': 'Scroll to bottom',
'chatHeader.toggleEnvironment': 'Toggle environment information',
'chatHeader.toggleRightPanel': 'Toggle right panel',
'environment.title': 'Environment',
'environment.changes': 'Changes',
'environment.changeCount': (v) => `${v?.count ?? 0} changed`,
'environment.clean': 'Clean',
'environment.workspace': 'Workspace',
'environment.branch': 'Branch',
'environment.history': 'Commit history',
'environment.agents': 'Subagents',
'environment.unnamedAgent': (v) => `Agent (${v?.index ?? 0})`,
'workflow.open': 'Open agent workflow',
'workflow.mainAgent': 'Main agent',
'workflow.empty': 'No subagents in this workflow',
'workflow.loadFailed': 'Failed to load agent workflow',
'environment.unavailable': 'Unavailable',
'sources.title': 'Sources',
'sources.count': (v) =>
`${v?.count ?? 0} ${(v?.count ?? 0) === 1 ? 'source' : 'sources'}`,
'sources.currentTurn': 'Sources for this turn',
'sources.add': 'Add source',
'sources.empty': 'Add files or links for reference.',
'sources.explanation':
'Adding a reference does not send its contents to the assistant.',
'sources.remove': 'Remove source',
'sources.open': 'Open source',
'sources.viewAll': 'View all',
'sources.type': 'Reference type',
'sources.workspaceFile': 'Workspace file',
'sources.link': 'Link',
'sources.location': 'Path or link',
'sources.name': 'Title (optional)',
'sources.description': 'Description (optional)',
'sources.registrationFailed':
'Message sent; some source details could not be saved',
'sources.attachmentsLoadFailed': (v) =>
`Failed to load uploaded files: ${v?.error ?? 'Unknown error'}`,
'sources.openOriginal': 'Open original',
'sources.unavailable':
'This reference is no longer available in this workspace.',
'environment.attachments': 'Attachments',
'environment.artifacts': 'Artifacts',
'environment.artifactsEmpty':
'Artifacts generated in this session will appear here.',
'rightPanel.attachmentLoadFailed': (v) =>
`Failed to load attachment: ${v?.error ?? 'Unknown error'}`,
'rightPanel.savedContentUnavailable': 'Saved panel content is unavailable',
'rightPanel.restoreFailed': (v) =>
`Failed to restore panel: ${v?.error ?? 'Unknown error'}`,
'userMessage.showMore': 'Show more',
'userMessage.showLess': 'Collapse',
'userMessage.sendFailed': 'Failed to send',
'userMessage.retrySend': 'Retry sending message',
'userMessage.edit': 'Edit message',
'userMessage.editSubmit': 'Send',
'userMessage.editSending': 'Sending…',
'userMessage.editBusy': 'Wait for the current turn to finish before editing.',
'userMessage.editStale':
'The message changed. Reopen the editor and try again.',
'userMessage.editAttachmentUnavailable':
'An attachment is unavailable. The message was not rewound.',
'userMessage.editSyncFailed':
'Could not confirm the rewind. Your edit is retained while waiting for synchronization.',
'userMessage.editFailed': (v) =>
`Could not resend the edited message: ${v?.reason ?? ''}`,
'turn.processed': 'Processed',
'turn.processing': 'Processing',
'turn.collapse': 'Collapse steps',
'turn.expand': 'Expand steps',
'turn.cached': 'cached',
'turn.executionSteps': (v) => {
const n = v?.count ?? 0;
return `${n} step${n === 1 ? '' : 's'}`;
},
'turn.toolCalls': (v) => {
const n = v?.count ?? 0;
return `${n} tool call${n === 1 ? '' : 's'}`;
},
'turn.thinkingCount': (v) => {
const n = v?.count ?? 0;
return `${n} thought${n === 1 ? '' : 's'}`;
},
'turn.stopped': 'You cancelled this request',
'turn.stoppedAfter': (v) => {
const seconds = v?.seconds ?? 0;
return `You cancelled this request after ${seconds} second${seconds === 1 ? '' : 's'}`;
},
'message.renderError': 'This message could not be displayed.',
'tasks.title': 'Background tasks',
'tasks.empty': 'No tasks currently running',
'tasks.refreshStale': 'Task status may be stale; reconnecting...',
'tasks.cancelFailed': 'Failed to cancel task',
'tasks.alreadyStopped': 'Task already stopped',
'tasks.moreAbove': (v) => `^ ${v?.count ?? 0} more above`,
'tasks.moreBelow': (v) => `v ${v?.count ?? 0} more below`,
'tasks.running': 'Running',
'tasks.pausing': 'Pausing',
'tasks.completed': 'Completed',
'tasks.failed': 'Failed',
'tasks.cancelled': 'Stopped',
'tasks.paused': 'Paused',
'tasks.kind.shell': 'Shell',
'tasks.kind.monitor': 'Monitor',
'tasks.kind.workflow': 'Workflow',
'workflow.graph.waiting': 'Waiting for the first agent dispatch…',
'workflow.graph.notRecorded': 'No execution graph was saved for this run.',
'workflow.inline.loading': 'Loading live workflow execution…',
'workflow.inline.unavailable':
'This workflow run is no longer available in the current session.',
'workflow.graph.omitted': (v) =>
`Graph limited for performance: ${v?.lanes ?? 0} phases, ${v?.nodes ?? 0} agents, and ${v?.edges ?? 0} connections omitted.`,
'workflow.noPhase': 'No phase',
'workflow.dispatchCount': (v) =>
`${v?.count ?? 0} dispatch${v?.count === 1 ? '' : 'es'}`,
'workflow.selectedDispatch': 'Selected dispatch',
'workflow.dependencies': 'Depends on',
'workflow.action.pause': 'Pause',
'workflow.action.resume': 'Resume',
'workflow.action.retry': 'Retry failed path',
'workflow.action.rerun': 'Rerun all',
'workflow.action.unavailable': 'Workflow state changed before the action.',
'workflow.action.argsUnavailable':
'No restart: its history does not have the args it was launched with.',
'workflow.action.failed': 'Could not update the workflow.',
'workflow.history.retry': (v) => `Retried from ${v?.runId ?? ''}`,
'workflow.history.rerun': (v) => `Rerun from ${v?.runId ?? ''}`,
'workflow.history.cached': (v) => `${v?.count ?? 0} cached`,
'workflow.history.saved': (v) => `${v?.count ?? 0} saved runs`,
'workflow.history.restored': 'Saved run',
'workflow.history.showRuns': (v) => `Run history (${v?.count ?? 0})`,
'workflow.history.hideRuns': 'Hide history',
'workflow.history.filter': 'Filter runs',
'workflow.history.filterAll': 'All statuses',
'workflow.history.visibleCount': (v) =>
`${v?.count ?? 0} of ${v?.total ?? 0}`,
'workflow.history.filterEmpty': 'No saved runs match this filter.',
'workflow.history.exportVisible': 'Export visible',
'workflow.history.delete': 'Delete',
'workflow.history.deleteSaved': 'Delete saved run',
'workflow.history.confirmDelete': 'Confirm delete',
'workflow.history.deleteUnavailable': 'The saved run is no longer available.',
'workflow.history.deleteFailed': 'Could not delete the saved run.',
'workflow.history.compareRun': (v) => `Compare run ${v?.runId ?? ''}`,
'workflow.history.compare': 'Compare runs',
'workflow.history.hideComparison': 'Hide comparison',
'workflow.history.source': 'Source run',
'workflow.history.compared': 'Compared run',
'workflow.history.current': 'Current run',
'workflow.history.status': 'Status',
'workflow.history.agents': 'Agents',
'workflow.approvalNeeded': 'Approval needed',
'workflow.respondInChat': 'Respond in chat',
'workflow.metric.agents': 'agents',
'workflow.metric.running': 'running',
'workflow.metric.queued': 'queued',
'workflow.metric.tokens': 'tokens',
'workflow.dispatch.queued': 'Queued',
'workflow.dispatch.running': 'Running',
'workflow.dispatch.completed': 'Completed',
'workflow.dispatch.failed': 'Failed',
'workflow.dispatch.cancelled': 'Cancelled',
'workflow.dispatch.cached': 'Cached',
'tasks.action.stop': 'Stop',
'tasks.action.abandon': 'Abandon',
'tasks.action.confirmStop': 'Confirm stop',
'tasks.action.confirmAbandon': 'Confirm abandon',
'tasks.action.confirmHint': 'This will end the blocking turn.',
'tasks.pill.agent': (v) => `${v?.count ?? 0} local agent`,
'tasks.pill.agents': (v) => `${v?.count ?? 0} local agents`,
'tasks.pill.agentPaused': (v) => `${v?.count ?? 0} local agent paused`,
'tasks.pill.agentsPaused': (v) => `${v?.count ?? 0} local agents paused`,
'tasks.pill.done': (v) => `${v?.count ?? 0} task done`,
'tasks.pill.doneMany': (v) => `${v?.count ?? 0} tasks done`,
'tasks.pill.monitor': (v) => `${v?.count ?? 0} monitor`,
'tasks.pill.monitors': (v) => `${v?.count ?? 0} monitors`,
'tasks.pill.shell': (v) => `${v?.count ?? 0} shell`,
'tasks.pill.shells': (v) => `${v?.count ?? 0} shells`,
'tasks.pill.workflow': (v) => `${v?.count ?? 0} workflow`,
'tasks.pill.workflows': (v) => `${v?.count ?? 0} workflows`,
'tasks.confirmStop': 'x again to confirm stop · ends the blocking turn',
'tasks.shortcut.select': '↑/↓ select',
'tasks.shortcut.view': 'Enter view',
'tasks.shortcut.stop': 'x stop',
'tasks.shortcut.abandon': 'x abandon',
'tasks.shortcut.listClose': '←/Esc close',
'tasks.shortcut.detailBack': '← go back',
'tasks.shortcut.detailClose': 'Esc/Enter/Space close',
'tasks.shortcut.close': 'Esc close',
'tasks.shortcut.cancelConfirm': 'Esc cancel',
'tasks.detail.workingDir': 'Working dir',
'tasks.detail.outputFile': 'Output file',
'tasks.detail.command': 'Command',
'tasks.detail.events': (v) => `${v?.count ?? 0} events`,
'tasks.detail.exit': (v) => `exit ${v?.exitCode ?? ''}`,
'tasks.detail.dropped': (v) => `${v?.count ?? 0} dropped`,
'tasks.detail.error': 'Error',
'tasks.detail.stoppedBecause': 'Stopped because',
'tasks.detail.resumeBlocked': 'Resume blocked',
'tasks.detail.progress': 'Progress',
'tasks.detail.prompt': 'Prompt',
'tasks.detail.type': 'Type',
'tasks.detail.runtime': 'Time',
'tasks.detail.eventCount': 'Events',
'tasks.detail.pid': 'PID',
'tasks.detail.lastEvent': 'Last event',
'tasks.detail.droppedCount': 'Dropped',
'tasks.detail.exitCode': 'Exit code',
'tasks.detail.tokenCount': 'Tokens',
'tasks.detail.toolCallCount': 'Tool calls',
'tasks.detail.tokens': (v) => `${v?.count ?? 0} tokens`,
'tasks.detail.toolCalls': (v) => `${v?.count ?? 0} tool calls`,
'tasks.detail.nesting': 'Nesting',
'tasks.detail.nestingValue': (v) =>
`Level ${v?.level ?? '?'} · from ${v?.parent ?? '?'}`,
'tasks.detail.nestingLevel': (v) => `Level ${v?.level ?? '?'}`,
'tasks.row.from': (v) => `from ${v?.parent ?? '?'}`,
'tasks.row.nested': 'nested',
'tips.items':
'Type / to see all available commands.|Use @ to reference file paths.|Press Esc to cancel an in-flight request.|Use Shift+Enter for a newline.|Press ↑↓ to browse message history.',
'tools.available': 'Available tools:',
'tools.none': 'No tools available.',
'tools.empty': 'No built-in tools available. Open a session first.',
'tools.footer': (v) =>
v?.name
? `${v?.details ? 'Enter/Space for details · ' : ''}t to toggle ${v.name} · r to refresh · Esc to close`
: 'r to refresh · Esc to close',
'tools.details.hide': 'Hide details',
'tools.details.show': 'Show details',
'tools.description': 'Description',
'tools.details': 'Tool details',
'tools.loading': 'Loading tools...',
'tools.name': 'Tool name',
'tools.noDescription': 'No description',
'tools.noMatches': 'No matching tools.',
'tools.search': 'Search tools…',
'tools.status': 'Status',
'tools.status.disabled': 'disabled',
'tools.status.enabled': 'enabled',
'tools.summary': (v) => `${v?.enabled ?? 0}/${v?.total ?? 0} enabled`,
'tools.title': 'Tools',
'tools.update.disable': 'Disable',
'tools.update.enable': 'Enable',
'tools.updating': 'Updating...',
'tool.collapse': '▲ Collapse',
'tool.expand': 'Expand',
'tool.viewFile': 'View file',
'tool.viewImage': 'View image',
'tool.viewCurrentFile': 'View the current file',
'tool.collapseHint': 'Collapse',
'tool.status.failed': 'Failed',
'toolGroup.moreKinds': (v) => ` +${v?.count ?? 0}`,
'toolGroup.summary': (v) =>
`Ran ${v?.count ?? 0} tool${v?.count === 1 ? '' : 's'}`,
'toolGroup.summary.ranAgents': (v) =>
`Ran ${v?.count ?? 0} agent${v?.count === 1 ? '' : 's'}`,
'toolGroup.summary.editedFiles': (v) =>
`Edited files ${v?.count ?? 0} time${v?.count === 1 ? '' : 's'}`,
'toolGroup.summary.ranCommands': (v) =>
`Ran ${v?.count ?? 0} command${v?.count === 1 ? '' : 's'}`,
'toolGroup.summary.readFiles': (v) =>
`Read files ${v?.count ?? 0} time${v?.count === 1 ? '' : 's'}`,
'toolGroup.summary.searched': (v) =>
`Searched ${v?.count ?? 0} time${v?.count === 1 ? '' : 's'}`,
'toolGroup.summary.updatedTodos': (v) =>
`Updated task list${v?.count === 1 ? '' : ` ${v?.count ?? 0} times`}`,
'toolGroup.summary.provideInformation': 'Provide information',
'toolGroup.summary.askedQuestions': (v) =>
`Asked ${v?.count ?? 0} question${v?.count === 1 ? '' : 's'}`,
'toolGroup.summary.otherTools': (v) =>
`Called ${v?.count ?? 0} other tool${v?.count === 1 ? '' : 's'}`,
'toolGroup.running': (v) =>
Number(v?.count ?? 0) > 1
? `Running ${v?.count ?? 0} tools: ${v?.name ?? 'tool'}`
: `Running ${v?.name ?? 'tool'}`,
'toolGroup.runningPrefix': 'Running',
'thinking.expand': 'Expand thinking',
'thinking.collapse': 'Collapse thinking',
'thinking.running': (v) => `Thinking${v?.duration ? ` ${v.duration}` : ''}`,
'thinking.doneBriefly': 'Thought briefly',
'thinking.done': (v) =>
v?.duration ? `Thought for ${v.duration}` : 'Done thinking',
'thinking.translate': 'Translate',
'thinking.translation': 'Translated thinking',
'thinking.translating': 'Translating...',
'thinking.translationThinking': 'Thinking...',
'thinking.translationFailed': 'Translation failed',
'thinking.retranslate': 'Translate again',
'thinking.cancelTranslation': 'Cancel',
'thinking.closeTranslation': 'Close',
'thinking.inputTokens': (v) => `Input tokens: ${v?.count ?? '--'}`,
'thinking.outputTokens': (v) => `Output tokens: ${v?.count ?? '--'}`,
'sessionsOverview.current': 'Current',
'sessionsOverview.empty': 'No sessions yet',
'sessionsOverview.loadFailed': 'Failed to load sessions',
'sessionsOverview.loading': 'Loading sessions…',
'sessionsOverview.noData': 'No data',
'sessionsOverview.openInSplit': 'Open in split',
'sessionsOverview.openInSplitHint':
'Show the selected sessions side by side in this window',
'sessionsOverview.splitLimit': (v) =>
`Select at most ${v?.max ?? 6} sessions to open them together`,
'sessionsOverview.openInTab': 'Open in new tab',
'sessionsOverview.openInTabHint':
'Open the selected sessions as a split view in a new browser tab',
'sessionsOverview.popupBlocked':
'Pop-up blocked. Allow pop-ups for this site to open sessions in new tabs.',
'sessionsOverview.refresh': 'Refresh',
'sessionsOverview.selectAll': 'Select all',
'sessionsOverview.titleColumn': 'Title',
'sessionsOverview.actions': 'Actions',
'sessionsOverview.time': 'Time',
'sessionsOverview.selectedRows': (v) =>
`${v?.count ?? 0} of ${v?.total ?? 0} row(s) selected.`,
'sessionsOverview.previousPage': 'Previous',
'sessionsOverview.nextPage': 'Next',
'sessionsOverview.pageInfo': (v) =>
`Page ${v?.page ?? 0} of ${v?.total ?? 0}`,
'sessionsOverview.rowsPerPage': 'Rows per page',
'sessionsOverview.workspaceFilter': 'Filter by workspace',
'sessionsOverview.allWorkspaces': 'All',
'sessionsOverview.searchPlaceholder': 'Search title, branch, PR or ID…',
'sessionsOverview.workspaceAll': 'All workspaces',
'sessionsOverview.workspacesSelected': (v) =>
`${v?.count ?? 0}/${v?.total ?? 0} workspaces`,
'sessionsOverview.statusColumn': 'Status',
'sessionsOverview.statusFilter': 'Filter by session status',
'sessionsOverview.filter.all': 'All',
'sessionsOverview.filter.attention': 'Needs attention',
'sessionsOverview.filter.running': 'Running',
'sessionsOverview.filter.idle': 'Idle',
'sessionsOverview.status.idle': 'Idle',
'sessionsOverview.details': (v) => `Details for ${v?.name ?? ''}`,
'sessionsOverview.sessionCount': (v) => `${v?.total ?? 0} session(s)`,
'sessionsOverview.confirmArchiveTitle': 'Archive session?',
'sessionsOverview.confirmArchive': (v) =>
`"${v?.name ?? ''}" will be moved to archived sessions.`,
'sessionsOverview.confirmArchiveBulkTitle': (v) =>
`Archive ${v?.count ?? 0} sessions?`,
'sessionsOverview.confirmArchiveBulk': (v) =>
`${v?.count ?? 0} selected sessions will be moved to archived sessions.`,
'sessionsOverview.confirmDeleteTitle': 'Delete session?',
'sessionsOverview.confirmDelete': (v) =>
`"${v?.name ?? ''}" and its conversation history will be permanently deleted. This cannot be undone.`,
'sessionsOverview.deleteFailed': 'Failed to delete session',
'sessionsOverview.archiveFailed': 'Failed to archive session',
'sessionsOverview.actionUnavailable':
'This action is unavailable for the selected session or workspace',
'sessionsOverview.bulkArchive': 'Archive',
'sessionsOverview.bulkArchiveHint': (v) =>
`Archive ${v?.count ?? 0} selected sessions`,
'sessionsOverview.bulkDelete': 'Delete',
'sessionsOverview.bulkDeleteHint': (v) =>
`Delete ${v?.count ?? 0} selected sessions`,
'sessionsOverview.confirmDeleteBulkTitle': (v) =>
`Delete ${v?.count ?? 0} sessions?`,
'sessionsOverview.confirmDeleteBulk': (v) =>
`${v?.count ?? 0} selected sessions and their conversation history will be permanently deleted. This cannot be undone.`,
'sessionsOverview.selectSession': (v) => `Select ${v?.name ?? ''}`,
'sessionsOverview.status.askUserQuestion': 'User input needed',
'sessionsOverview.status.needsApproval': 'Needs approval',
'sessionsOverview.status.running': 'Running',
'sessionsOverview.title': 'Session Overview',
'workspacesOverview.title': 'Workspaces',
'workspacesOverview.count': (v) => `${v?.count ?? 0} workspaces`,
'workspacesOverview.column.name': 'Name',
'workspacesOverview.column.path': 'Path',
'workspacesOverview.column.sessions': 'Sessions',
'workspacesOverview.column.mcp': 'MCP',
'workspacesOverview.column.git': 'Branch',
'workspacesOverview.column.lastActivity': 'Last activity',
'workspacesOverview.column.actions': 'Actions',
'workspacesOverview.primaryBadge': 'primary',
'workspacesOverview.running': (v) => `${v?.count ?? 0} running`,
'workspacesOverview.attention': (v) => `${v?.count ?? 0} need attention`,
'workspacesOverview.truncated':
'More sessions than one page; counts are a lower bound.',
'workspacesOverview.dirty': (v) => `${v?.count ?? 0} changed`,
'workspacesOverview.mcpFailed': (v) => `${v?.count ?? 0} failed`,
'workspacesOverview.newTask': 'New task',
'workspacesOverview.trust': 'Trust',
'workspacesOverview.trusting': 'Trusting…',
'workspacesOverview.trustFailed': 'Could not trust the workspace',
'workspacesOverview.remove': 'Remove workspace',
'workspacesOverview.back': 'Back',
'splitView.title': 'Split View',
'splitView.count': (v) => `${v?.count ?? 0} panes`,
'splitView.addPane': 'Add session',
'splitView.closePane': 'Close pane',
'splitView.maximizePane': 'Maximize pane',
'splitView.restorePane': 'Restore pane',
'splitView.morePaneActions': 'More pane actions',
'splitView.defaultActionLabel': 'Action',
'splitView.paneError': 'This session pane hit an error',
'splitView.paneConnectionError': 'Connection lost',
'splitView.outerApprovalPending':
'Your main session is waiting for approval.',
'splitView.goToApproval': 'Go to it',
'splitView.pendingCount': (v) => `${v?.count ?? 0} awaiting input`,
'splitView.nextPending': 'Go to the next session awaiting input',
'splitView.empty': 'No sessions in the split. Add one to get started.',
'splitView.composerPlaceholder': 'Message this session…',
'channels.title': 'Channels',
'channels.description':
'Connect Qwen Code to the places where your team already works.',
'channels.summary': (v) =>
`${v?.workspace ?? ''} · ${v?.count ?? 0} configured`,
'channels.workspace.current': 'Current workspace',
'channels.workspace.label': 'Workspace',
'channels.workspace.primary': 'Primary',
'channels.loading': 'Loading channels',
'channels.configuredCount': (v) => plural(v?.count, 'configured channel'),
'channels.configured': 'Configured channels',
'channels.configured.description':
'Manage the bots that receive and deliver messages for this workspace.',
'channels.availablePlatforms': 'Available platforms',
'channels.availablePlatforms.description':
'Choose a platform to add another connection to this workspace.',
'channels.platform.available': 'Available',
'channels.platform.configure': 'Configure',
'channels.platform.add': 'Add connection',
'channels.platform.configureNamed': (v) =>
`Configure ${v?.platform ?? 'Channel'}`,
'channels.status.stopped': 'Stopped',
'channels.status.starting': 'Starting',
'channels.status.connected': 'Connected',
'channels.status.partial': 'Partially connected',
'channels.status.error': 'Error',
'channels.statusDescription.stopped': 'Offline and not receiving messages.',
'channels.statusDescription.starting': 'Connecting to the platform now.',
'channels.statusDescription.connected':
'Online and ready to receive messages.',
'channels.statusDescription.partial':
'Connected, but some capabilities are unavailable.',
'channels.statusDescription.error': 'Needs attention before it can connect.',
'channels.startsWithServe': 'Connect when Qwen Code starts',
'channels.startsWithServe.description':
'Automatically bring this Channel online after Qwen Code starts.',
'channels.unsupported.title': 'Channel management is not supported',
'channels.unsupported.description':
'Update Qwen Code to a version that supports Channel management.',
'channels.readOnly.title': 'Channel management is read-only',
'channels.readOnly.description':
'Restart Qwen Code with a bearer token to control channels.',
'channels.loadError.title': 'Channels could not be loaded',
'channels.empty.title': 'No supported channels configured',
'channels.empty.description':
'Configure DingTalk, WeCom, Feishu, GitHub, or GitLab to receive messages in this workspace.',
'channels.runtimeError': 'Channel runtime error',
'channels.action.back': 'Back',
'channels.action.refresh': 'Refresh',
'channels.action.start': 'Start',
'channels.action.stop': 'Stop',
'channels.action.restart': 'Restart',
'channels.action.retry': 'Retry',
'channels.action.edit': 'Edit',
'channels.action.editNamed': (v) => `Edit ${v?.name ?? 'Channel'}`,
'channels.action.moreNamed': (v) =>
`More actions for ${v?.name ?? 'Channel'}`,
'channels.action.delete': 'Delete',
'channels.action.deleteNamed': (v) => `Delete ${v?.name ?? 'Channel'}`,
'channels.action.startWithServeNamed': (v) =>
`Start ${v?.name ?? ''} with serve`,
'channels.delete.title': (v) => `Delete ${v?.name ?? 'Channel'}?`,
'channels.delete.description':
'The Channel will be stopped and removed from this workspace. This action cannot be undone.',
'channels.delete.error': 'Channel was not deleted',
'channels.editor.addTitle': (v) => `Configure ${v?.platform ?? 'Channel'}`,
'channels.editor.editTitle': (v) => `Edit ${v?.platform ?? 'Channel'}`,
'channels.editor.addDescription':
'Connect a registered workspace with an existing platform application.',
'channels.editor.editDescription':
'Update public settings or explicitly change stored credentials.',
'channels.editor.section.identity': 'Identity',
'channels.editor.section.credentials': 'Credentials',
'channels.editor.section.session': 'Conversation management',
'channels.editor.section.access': 'Access control',
'channels.editor.section.access.description':
'Configure direct-message and group access separately.',
'channels.editor.session.isolation': 'Conversation isolation',
'channels.editor.instanceName': 'Instance name',
'channels.editor.instanceNamePlaceholder': 'e.g. release-bot',
'channels.editor.workspace': 'Workspace',
'channels.editor.workspace.description':
'Messages, sessions, and Channel settings belong to this workspace. The primary workspace is selected by default.',
'channels.editor.workspace.lockedDescription':
'A configured Channel stays bound to its workspace. Create another instance to use a different workspace.',
'channels.editor.environmentReference': '$ENV_VAR supported',
'channels.editor.field.sessionScope': 'Session scope',
'channels.editor.field.sessionScope.description':
'Controls which incoming conversations share one agent session.',
'channels.editor.field.sessionScope.option.user': 'Per user and chat',
'channels.editor.field.sessionScope.option.thread': 'Per thread',
'channels.editor.field.sessionScope.option.chat_thread':
'Per chat and thread',
'channels.editor.field.sessionScope.option.single': 'One shared session',
'channels.editor.field.dingtalk.clientId': 'Client ID (AppKey)',
'channels.editor.field.dingtalk.clientSecret': 'Client Secret (AppSecret)',
'channels.editor.field.wecom.botId': 'Bot ID',
'channels.editor.field.wecom.secret': 'Bot Secret',
'channels.editor.field.wecom.wsUrl': 'WebSocket URL',
'channels.editor.field.feishu.clientId': 'App ID',
'channels.editor.field.feishu.clientSecret': 'App Secret',
'channels.editor.field.github.token': 'Personal Access Token',
'channels.editor.field.github.token.description':
'Optional classic PAT with "notifications" scope. Overrides local gh authentication',
'channels.editor.field.github.useLocalGh':
'Use local GitHub CLI authentication',
'channels.editor.field.github.useLocalGh.description':
'Explicitly reuse the daemon host’s account-wide gh login when no token is configured',
'channels.editor.field.github.baseUrl': 'API Base URL',
'channels.editor.field.github.baseUrl.description':
'GitHub Enterprise API root (e.g. https://ghe.example.com/api/v3). Leave empty for github.com',
'channels.editor.field.github.groupPolicy': 'Group Policy',
'channels.editor.field.github.groupPolicy.description':
'Must be "Open", "Allowlist", or "Pairing" for notifications to flow',
'channels.editor.field.github.reasonFilter': 'Reason Filter',
'channels.editor.field.github.reasonFilter.description':
'Optional. Comma-separated notification reasons to process. Valid values: mention, review_requested, assign, author, comment, ci_activity, manual, state_change, subscribed, team_mention, security_alert, approval_requested, invitation, member_feature_requested, security_advisory_credit. Leave empty to process all.',
'channels.editor.field.gitlab.token': 'Personal Access Token',
'channels.editor.field.gitlab.token.description':
'PAT with "read_api" + "api" scopes',
'channels.editor.field.gitlab.baseUrl': 'Instance URL',
'channels.editor.field.gitlab.baseUrl.description':
'Self-hosted instance URL (e.g. https://gitlab.example.com). Leave empty for gitlab.com',
'channels.editor.field.gitlab.groupPolicy': 'Group Policy',
'channels.editor.field.gitlab.groupPolicy.description':
'Must be "Open", "Allowlist", or "Pairing" for todos to be processed',
'channels.editor.field.gitlab.action_prompt_template': 'Action Templates',
'channels.editor.field.gitlab.action_prompt_template.description':
'Only actions with a template are processed; others are skipped. Template variables: %project%, %project_url%, %author%, %target_type%, %iid%, %title%, %description%, %todo_id%. Use %% for a literal %. Example for "mentioned": Project: %project% | Author: %author% | Title: %title%',
'channels.editor.field.gitlab.action_prompt_template.option.mentioned':
'Mentioned — @bot in a comment or description',
'channels.editor.field.gitlab.action_prompt_template.option.directly_addressed':
'Directly Addressed — comment starts with @bot',
'channels.editor.field.gitlab.action_prompt_template.option.assigned':
'Assigned — bot assigned to an issue or MR',
'channels.editor.field.gitlab.action_prompt_template.option.review_requested':
'Review Requested — bot requested as MR reviewer',
'channels.editor.field.gitlab.action_prompt_template.option.approval_required':
'Approval Required — MR needs bot approval',
'channels.editor.field.gitlab.action_prompt_template.option.marked':
"Marked — someone stars bot's comment/issue/MR",
'channels.editor.field.gitlab.action_prompt_template.option.build_failed':
'Build Failed — CI/CD pipeline fails on bot branch/MR',
'channels.editor.field.gitlab.action_prompt_template.option.unmergeable':
'Unmergeable — MR becomes unmergeable (conflicts)',
'channels.editor.field.gitlab.action_prompt_template.option.merge_train_removed':
'Merge Train Removed — MR removed from merge train',
'channels.editor.secret.environment': 'Stored in environment',
'channels.editor.secret.stored': 'Stored securely',
'channels.editor.secret.preserve': 'Keep',
'channels.editor.secret.replace': 'Replace',
'channels.editor.secret.clear': 'Clear',
'channels.editor.secret.placeholder': (v) => `Enter ${v?.label ?? 'secret'}`,
'channels.editor.secret.clearHint':
'This credential will be removed when you save.',
'channels.editor.field.shared.outputMode': 'Output Mode',
'channels.editor.field.shared.outputMode.description':
'Choose one final result for the complete task, each complete assistant response, or the last reply in each turn. Defaults to per turn: the main response finishes independently of background follow-ups. Applies to cards and ordinary messages.',
'channels.editor.field.shared.outputMode.option.per_task': 'Per task',
'channels.editor.field.shared.outputMode.option.per_response': 'Per response',
'channels.editor.field.shared.outputMode.option.per_turn':
'Per turn (default)',
'channels.editor.field.shared.privatePolicy': 'Direct message policy',
'channels.editor.field.dws.privatePolicy': 'Direct message policy',
'channels.editor.field.dws.privatePolicy.description':
'Controls which users can start direct-message, document-notification, and native-todo tasks.',
'channels.editor.field.shared.privatePolicy.description':
'Choose who can start a direct conversation with this Channel.',
'channels.editor.field.shared.privatePolicy.option.disabled': 'Disabled',
'channels.editor.field.shared.privatePolicy.option.pairing': 'Pairing',
'channels.editor.field.shared.privatePolicy.option.allowlist': 'Allowlist',
'channels.editor.field.shared.privatePolicy.option.open': 'Open',
'channels.editor.field.shared.allowedUsers': 'Allowed user IDs',
'channels.editor.field.shared.allowedUsers.description':
'Comma-separated stable user IDs that can start private conversations without pairing.',
'channels.editor.field.shared.groupPolicy': 'Group policy',
'channels.editor.field.shared.groupPolicy.description':
'Choose which group conversations can use this Channel.',
'channels.editor.field.shared.groupPolicy.option.disabled': 'Disabled',
'channels.editor.field.shared.groupPolicy.option.pairing': 'Pairing',
'channels.editor.field.shared.groupPolicy.option.allowlist': 'Allowlist',
'channels.editor.field.shared.groupPolicy.option.open': 'Open',
'channels.editor.field.shared.allowedGroupIds': 'Allowed group IDs',
'channels.editor.field.shared.allowedGroupIds.description':
'Comma-separated stable chat or repository IDs allowed to use this Channel.',
'channels.editor.field.shared.allowedGroupIds.placeholder':
'group-a, group-b',
'channels.editor.field.shared.groupSenders': 'Who can talk in groups',
'channels.editor.field.shared.groupSenders.description':
'Applies to every admitted group. Set a single group differently in settings.json.',
'channels.editor.field.shared.groupSenders.option.open': 'Any group member',
'channels.editor.field.shared.groupSenders.option.allowlist':
'Listed members only',
'channels.editor.field.shared.groupAllowedUsers': 'Allowed group member IDs',
'channels.editor.field.shared.groupAllowedUsers.description':
'Comma-separated stable user IDs who can talk in groups. Separate from the allowed user IDs for direct messages.',
'channels.editor.field.shared.groupAllowedUsers.placeholder':
'user-a, user-b',
'channels.editor.field.shared.operators': 'Session operators',
'channels.editor.field.shared.operators.description':
'Comma-separated user IDs who can approve tool use and run /cancel, /clear or /loop in shared sessions. Leave empty to grant no shared-session operator permissions.',
'channels.editor.field.shared.sessionScope': 'Conversation isolation',
'channels.editor.field.shared.sessionScope.description':
'Choose how conversations share persistent agent context.',
'channels.editor.field.shared.sessionScope.option.user': 'By user',
'channels.editor.field.shared.sessionScope.option.thread':
'By thread (legacy)',
'channels.editor.field.shared.sessionScope.option.chat_thread':
'By chat or thread',
'channels.editor.field.shared.sessionScope.option.single': 'Share all',
'channels.editor.field.shared.sessionScope.detail.user':
"The same user's messages continue in one conversation; users stay isolated from each other.",
'channels.editor.field.shared.sessionScope.detail.thread':
'Preserves the legacy thread routing used by existing Channel sessions.',
'channels.editor.field.shared.sessionScope.detail.chat_thread':
'Messages in the same group or topic share one conversation; best for collaboration.',
'channels.editor.field.shared.sessionScope.detail.single':
'Every message shares one conversation; best for a single-bot duty channel.',
'channels.editor.field.shared.multiSession': 'Named tasks',
'channels.editor.field.shared.instructions': 'Instructions',
'channels.editor.field.shared.instructions.description':
'Guidance injected into the context of each channel session. Some channels replace their own default guidance when this is set.',
'channels.editor.field.shared.multiSession.description':
'Keep a separate owner-scoped catalog of named tasks in daemon-managed mode.',
'channels.editor.policy.disabled.title': 'Disabled',
'channels.editor.policy.disabled.description':
'Disable private conversations.',
'channels.editor.policy.allowlist.title': 'Allowlist',
'channels.editor.policy.allowlist.description':
'Only listed users can start private conversations.',
'channels.editor.policy.pairing.title': 'Pairing',
'channels.editor.policy.pairing.description':
'People receive a pairing code and can chat after you approve them.',
'channels.editor.pairing.title': 'Pending requests',
'channels.editor.pairing.description':
'Match the shared code before approving access. Approvals take effect immediately; Save and Cancel do not undo them.',
'channels.editor.pairing.subject.group': (v) =>
`Group: ${v?.name ?? 'Unknown'}`,
'channels.editor.pairing.requestedBy': (v) =>
`Requested by ${v?.sender ?? 'Unknown'}`,
'channels.editor.pairing.refresh': 'Refresh pairing requests',
'channels.editor.pairing.approve': 'Approve',
'channels.editor.pairing.approveFor': (v) =>
`Approve ${v?.sender ?? 'request'}, code ${v?.code ?? ''}`,
'channels.editor.pairing.approved': (v) =>
`${v?.sender ?? 'This person'} can now use this Channel.`,
'channels.editor.pairing.error': 'Pairing requests were not updated',
'channels.editor.pairing.unavailable':
'Pairing requests are temporarily unavailable. Try again.',
'channels.editor.pairing.retry': 'Try again',
'channels.editor.pairing.empty.title': 'No pending requests',
'channels.editor.pairing.empty.description':
'New requests appear here after someone messages the bot.',
'channels.editor.pairing.saveFirst.title': 'Save pairing mode first',
'channels.editor.pairing.saveFirst.description':
'Pending requests will appear here after this Channel is saved in pairing mode.',
'channels.editor.pairing.approvals.title': 'Pairing approvals',
'channels.editor.pairing.approvals.description':
'User and group IDs approved through pairing for this Channel.',
'channels.editor.pairing.approvals.refresh': 'Refresh pairing approvals',
'channels.editor.pairing.approvals.revoke': 'Revoke',
'channels.editor.pairing.approvals.revokeFor': (v) =>
`Revoke ${v?.senderId ?? 'pairing approval'}`,
'channels.editor.pairing.approvals.revoked': (v) =>
`Pairing approval for ${v?.senderId ?? 'this sender'} was revoked.`,
'channels.editor.pairing.approvals.error':
'Pairing approvals were not updated',
'channels.editor.pairing.approvals.unavailable':
'Pairing approvals are temporarily unavailable. Try again.',
'channels.editor.pairing.approvals.empty.title': 'No pairing approvals',
'channels.editor.pairing.approvals.empty.description':
'Approved user and group IDs will appear here.',
'channels.editor.pairing.approvals.confirm.title': (v) =>
`Revoke pairing approval for ${v?.senderId || 'this sender'}?`,
'channels.editor.pairing.approvals.confirm.description':
'Only the approval created through pairing will be removed. Access configured in the Channel allowlist is not changed.',
'channels.editor.pairing.approvals.confirm.action': 'Revoke approval',
'channels.editor.pairing.allowlist.title': 'Configured allowlist',
'channels.editor.pairing.allowlist.description':
'Configured allowlist users remain allowed after a pairing approval is revoked.',
'channels.editor.policy.open.title': 'Open',
'channels.editor.policy.open.description':
'Anyone who can reach the bot can start a conversation.',
'channels.editor.validation.required': (v) =>
`${v?.label ?? 'This field'} is required.`,
'channels.editor.validation.credential':
'Enter a token or enable local GitHub CLI authentication.',
'channels.editor.validation.duplicate':
'A Channel with this name already exists.',
'channels.editor.validation.invalidName': 'Choose a different instance name.',
'channels.editor.validation.invalidGroupId':
'Enter a group ID other than __proto__, constructor, or prototype.',
'channels.editor.validation.invalidOption':
"Remove values that aren't in the allowed list.",
'channels.editor.validation.number': 'Enter a valid number.',
'channels.editor.validation.outOfRange': (v) =>
`Enter a number greater than ${v?.min ?? 0}.`,
'channels.editor.validation.policy': 'Choose an access policy.',
'channels.editor.saveError': 'Changes were not saved',
'channels.editor.reloadLatest': 'Reload latest',
'channels.editor.cancel': 'Cancel',
'channels.editor.save': 'Save',
'localControl.open': 'Mobile access',
'localControl.expires': (v) =>
`One-time QR · Expires in ${v?.seconds ?? ''}s · Refreshes automatically`,
'localControl.expired': 'QR code expired. Getting a fresh code…',
'localControl.retry': 'Retry',
'localControl.noNetwork':
'No local network address is available. Open the Web Shell through an address your phone can reach.',
'localControl.securePairing':
'Scan to grant access until this daemon restarts.',
'localControl.insecurePairing':
'Scan to grant access until this daemon restarts. Traffic is unencrypted; use a trusted network.',
'localControl.securePairingDynamic':
"Scan to grant access to this daemon. The device that scans stays signed in until the daemon restarts or that device's tab is closed.",
'localControl.insecurePairingDynamic':
"Scan to grant access to this daemon. The device that scans stays signed in until the daemon restarts or that device's tab is closed. Traffic is unencrypted; use a trusted network.",
'localControl.disabledHint':
'Local Control is off. Turn it on in Settings to pair a phone on the same network.',
'localControl.openSettings': 'Open Settings',
'browserNotifications.label': 'Task notifications',
'browserNotifications.description':
'Notify when the current chat or a split-view chat finishes, fails, needs approval or waits for your answer while this page is in the background or unfocused. Completed turns show prompt and reply excerpts; action reminders show the session title and waiting status. Saved for this browser site only; the page must remain open.',
'browserNotifications.prompt': (v) => `Prompt: ${v?.text ?? ''}`,
'browserNotifications.reply': (v) => `Reply: ${v?.text ?? ''}`,
'browserNotifications.completed': 'This turn has completed.',
'browserNotifications.failed':
'This turn failed. Return to view the details.',
'browserNotifications.ended':
'This turn has ended. Return to check the result.',
'browserNotifications.approval':
'This session needs your approval. Return to review the request.',
'browserNotifications.question':
'This session is waiting for your answer. Return to respond.',
'browserNotifications.allow': 'Allow notifications',
'browserNotifications.enable': 'Enable notifications',
'browserNotifications.helpEnabled': 'Enabled for this site.',
'browserNotifications.helpWaiting': 'Notifications are not authorized yet.',
'browserNotifications.helpWhen':
'While this page is in the background or you switch to another tab, get reminders when the current chat needs approval, waits for your answer, finishes or fails. Clicking a notification returns to its chat without approving or answering.',
'browserNotifications.helpSystem':
'If no reminders appear, follow the steps below to check system notifications.',
'browserNotifications.helpMac':
'Open System Settings → Notifications. Select your browser (for Chrome, also check Google Chrome Helper (Alerts) if listed), enable notifications and desktop banners/alerts. Check Focus and whether notifications are allowed during screen sharing.',
'browserNotifications.helpWindows':
'Open Settings → System → Notifications (Windows 10: Notifications & actions). Enable notifications and your browser, including notification banners. Turn off Do not disturb / Focus assist, or allow your browser through its rules.',
'browserNotifications.enabled': 'Enabled.',
'browserNotifications.disabled': 'Disabled.',
'browserNotifications.waiting': 'Waiting for browser permission.',
'browserNotifications.denied':
'Notifications are blocked. Allow them in your browser site settings.',
'browserNotifications.unavailable':
'Notifications are unavailable in this browser or page context.',
'browserNotifications.requesting': 'Waiting for your permission…',
'browserNotifications.error':
'Unable to enable or show notifications. Check your browser and system settings.',
'browserNotifications.temporary':
'This setting is saved for the current page only.',
'welcome.changeModel': '(/model to change)',
'welcome.defaultModel': 'unknown model',
'welcome.modeHint': 'Shift+Tab or /approval-mode',
'welcome.prompt': 'What would you like to do?',
'welcome.titlePrefix': 'Welcome to',
'welcome.tipLabel': 'Tips:',
...VOICE_MESSAGES_EN,
...LIVE_MESSAGES_EN,
...COLLAB_MESSAGES_EN,
...SETTINGS_MESSAGES_EN,
...MANAGED_TASK_MESSAGES_EN,
...TRAJECTORY_FILTER_MESSAGES_EN,
...TRAJECTORY_WINDOW_MESSAGES_EN,
};
const ZH: Messages = {
...EN,
'capacityChoice.persistenceUnconfirmed':
'无法确认最后一轮被中断内容是否已保存。',
'capacityChoice.title': '选择要停止的工作区',
'capacityChoice.description':
'当前没有可用的 ACP 容量。选择一个工作区停止其会话,或取消并继续现有工作。',
'capacityChoice.warning':
'停止将中断列出的所有会话及其工具。文件、工作区注册和已保存历史会保留,未保存工作可能丢失。确认后关闭此弹窗不会撤销停止。',
'capacityChoice.outdated':
'草稿、会话或 daemon 已变化,请取消后重新执行原操作。',
'capacityChoice.inProgress': '所选停止仍在处理,请刷新状态后再继续。',
'capacityChoice.failedUnreleased':
'停止失败。确认旧进程全部退出前,此工作区暂不可用,容量仍被占用。可刷新查看清理结果。',
'capacityChoice.failedUnknownCleanup':
'停止失败,清理结果尚未确认。请刷新状态后再继续。',
'capacityChoice.workspaces': '要停止的工作区',
'capacityChoice.requester': '此工作区属于正在尝试继续的原操作。',
'capacityChoice.running': '运行中',
'capacityChoice.waiting': '等待你的回复',
'capacityChoice.background': '后台工作运行中',
'capacityChoice.backgroundUnknown': '后台工作状态未知',
'capacityChoice.none':
'当前没有可在此停止的工作区。请查看上述原因,先结束独立工作,或取消。',
'capacityChoice.refresh': '刷新状态',
'capacityChoice.continue': '继续原操作',
'capacityChoice.confirm': '停止这些会话并继续',
'capacityChoice.stopped':
'此工作区已停止,以释放 ACP 容量。需要时可主动恢复此会话。',
'capacityChoice.resume': '恢复会话',
'capacityChoice.blocked.stopping': '正在停止',
'capacityChoice.blocked.not_live': '没有运行中的 ACP',
'capacityChoice.blocked.release_unavailable': '无法确认自有进程释放',
'capacityChoice.blocked.session_start_pending': '正在启动或恢复会话',
'capacityChoice.blocked.workspace_control_pending':
'工作区管理或 MCP 操作进行中',
'capacityChoice.blocked.session_closing': '会话正在关闭或重置',
'capacityChoice.blocked.runtime_unavailable': '工作区不可用或不可信',
'capacityChoice.blocked.special_runtime': '特殊用途工作区',
'capacityChoice.blocked.unsupported': '不支持停止此运行时',
'capacityChoice.blocked.activity_unknown': '无法确认活动状态',
'capacityChoice.blocked.pendingSessionStarts': '等待会话启动',
'capacityChoice.blocked.acpConnections': '有 ACP 客户端连接',
'capacityChoice.blocked.memoryTasks': '记忆任务运行中',
'capacityChoice.blocked.channelWorkers': '渠道 worker 运行中',
'capacityChoice.blocked.voiceSessions': '语音会话活跃',
'capacityChoice.blocked.management_pending': '工作区管理操作待完成',
'capacityChoice.blocked.scheduler_pending': '正在恢复定时任务会话',
'capacityChoice.blocked.enabled_scheduled_tasks': '请先禁用已启用的定时任务',
'capacityChoice.blocked.scheduled_tasks_unknown': '无法读取定时任务',
'capacityChoice.capacity': (v) => `ACP 容量:${v?.used} / ${v?.limit}`,
'capacityChoice.sessions': (v) => `${v?.count} 个已加载会话`,
'capacityChoice.queued': (v) => `${v?.count} 个排队请求`,
'capacityChoice.outcome': (v) =>
`已关闭 ${v?.closed} 个会话,剩余 ${v?.remaining} 个。`,
'footnotes.note': (v) => `脚注 ${v?.number ?? ''}`,
'footnotes.references': (v) => `查看 ${v?.count ?? ''} 条引用`,
'footnotes.preview': '引用预览',
'footnotes.previous': '上一条引用',
'footnotes.next': '下一条引用',
'footnotes.citations': (v) => `${v?.count ?? 0} 个引用`,
'daemon.capacity.exhausted':
'已达到当前服务的并发容量上限,暂时无法启动此会话。请稍后重试,或取消本次操作。',
'managed.title': '托管 Agent',
'managed.sessions': '托管会话',
'managed.conversation': '托管会话内容',
'managed.new': '新建托管任务',
'managed.refresh': '刷新',
'managed.empty': '暂无托管任务。',
'managed.loading': '加载中…',
'managed.more': '加载更多',
'managed.prompt': '向托管 Agent 发送消息',
'managed.runtime': '执行环境',
'managed.unavailable': '当前 daemon 未启用托管 Agent。',
'managed.send': '发送',
'managed.sending': '提交中…',
'managed.elapsed': (v) => `已用时 ${v?.seconds ?? 0} 秒`,
'managed.runningHint': '本轮执行中,暂时不能发送新消息。',
'managed.retry': '重试同一请求',
'managed.cancel': '取消本轮',
'managed.uncertain': '请求结果尚未确认。重试会确认或完成同一次提交。',
'managed.discard': '丢弃本次请求',
'managed.discarded': '已丢弃本次请求。草稿已放回输入框。',
'managed.newRequired': '请新建任务后发送消息。',
'managed.truncated': '[详情已截断]',
'managed.approval.failed':
'无法确认审批回答的结果。请重试同一选项,或刷新以查看状态。',
'managed.approval.loadFailed': '待审批请求加载失败。',
'managed.approval.refreshFailed': '待审批请求刷新失败。',
'managed.approval.retry': '重新读取审批',
'managed.approval.forbidden':
'只有此会话的拥有者或所属 Workspace 的操作者可以回答这项审批。',
'managed.approval.argumentsUnavailable': '此项审批的工具参数暂不可见。',
'managed.approval.previewComplete': (v) =>
`输入预览:${v?.bytes ?? 0} 字节。`,
'managed.approval.previewTruncated': (v) =>
`输入预览已截断,完整输入共 ${v?.bytes ?? 0} 字节。`,
'managed.result.range': (v) => `字节 ${v?.start}–${v?.end},共 ${v?.total}`,
'managed.result.outputs': '输出',
'managed.result.view': '查看输出',
'managed.result.empty': '暂无已发布输出。',
'managed.result.description': '读取已保存的输出,不会重新执行命令。',
'managed.result.preview': '获准预览',
'managed.result.previewTruncated': '预览已裁剪;这不代表捕获的输出不完整。',
'managed.result.execution.success': '命令成功',
'managed.result.execution.error': '命令失败',
'managed.result.execution.cancelled': '命令已取消',
'managed.result.execution.not_started': '命令未执行',
'managed.result.capture.complete': '捕获完整',
'managed.result.capture.partial': '捕获不完整',
'managed.result.capture.unavailable': '捕获不可用',
'managed.result.capture.none': '未捕获',
'managed.result.delivery.pending': '正在保存输出',
'managed.result.delivery.committed': '输出已保存',
'managed.result.delivery.blocked': '输出交付阻塞',
'managed.result.forbidden': '当前账号无权读取原始输出。',
'managed.result.unavailable': '保存的字节当前不可用。',
'managed.result.downloadUnsupported':
'此浏览器需要宿主接入,才能保存流式下载。',
'managed.result.previous': '上一页',
'managed.result.next': '下一页',
'managed.result.expired': '此输出版本已过期。',
'managed.result.changed': '此输出版本已变化,请刷新后选择当前版本。',
'managed.result.reading': '正在读取输出…',
'managed.result.emptyStream': '空输出(0 字节)',
'managed.result.close': '关闭输出',
'managed.result.refresh': '刷新输出',
'managed.phase.created': '已创建',
'managed.workspaceCreateTitle': '创建工作区会话',
'managed.workspaceLabel': '工作区',
'managed.modelPreset': '模型 / Agent 预设',
'managed.modelDefault': '服务端默认模型',
'managed.modelPinned': '模型在新会话中固定;更换模型或工作区请新建会话。',
'managed.workspaceChoose': '选择工作区',
'managed.workspaceDirectory': '相对目录',
'managed.cwd.change': '切换目录',
'managed.cwd.path': '相对于 Workspace 根目录的路径',
'managed.cwd.description':
'输入相对于 Workspace 根目录的路径,. 表示根目录。后续任务在新目录执行,对话历史保留。',
'managed.cwd.close': '关闭',
'managed.cwd.changing': '正在切换目录…',
'managed.cwd.confirm': '继续确认',
'managed.cwd.unconfirmed': '目录切换结果尚未确认,请继续确认原请求。',
'managed.cwd.unconfirmedForbidden':
'当前账号无权确认此操作,切换结果仍待确认;在服务器给出最终结果或新开标签页之前,发送将保持禁用。',
'managed.cwd.busy': '请先完成正在执行的任务、审批或未确认请求,再切换目录。',
'managed.cwd.invalid': '目录无效或无法访问。',
'managed.cwd.conflict': '当前目录已变化,请检查后重新提交。',
'managed.cwd.unavailable': 'Workspace 当前无法切换目录。',
'managed.cwd.forbidden': '当前账号没有切换此目录的权限。',
'managed.cwd.storage': '浏览器会话存储不可用,无法安全发起目录切换。',
'managed.cwd.failed': '目录切换失败,请检查当前目录后重试。',
'managed.cwd.updated': (v) =>
`当前目录已变为 ${v?.cwd ?? ''},请先确认此上下文再提交。`,
'managed.cwd.useCurrent': '使用当前目录上下文',
'managed.workspaceCreate': '创建会话',
'managed.workspaceBound': '已绑定工作区',
'managed.workspaceExecutionUnavailable':
'工作区已绑定;你不能在此会话中发送消息。',
'managed.workspaceSharedFiles':
'同一工作区的会话共享文件;目录可用性将在执行前验证。',
'managed.workspaceEmpty': '没有可读取的工作区。',
'managed.workspaceUnsupported': '当前服务不支持工作区绑定。',
'managed.workspacePermission': '没有发现工作区的权限。',
'managed.workspaceLoadFailed': '加载工作区失败。',
'managed.workspaceStorageUnavailable':
'浏览器会话存储不可用,无法安全地开始创建。',
'managed.workspaceUncertain':
'创建结果尚未确认。可重试已保存的请求,或读取已返回的会话。',
'managed.workspaceRetryRead': '重试读取会话',
'managed.workspaceSessionId': '会话 ID',
'managed.workspaceProtocolError': (v) =>
`会话 ${v?.sessionId ?? ''} 已创建,但无法确认其工作区绑定。`,
'managed.workspaceAbandon': '放弃本地确认记录',
'managed.workspaceAbandonWarning':
'原空会话可能已经存在;放弃记录不会删除服务端会话。',
'managed.workspaceAbandonInputWarning':
'包含该输入的会话可能已存在或仍在运行;放弃记录不会取消它。再次发送会开启新请求,可能重复执行。',
'managed.workspaceSwitchTitle': '切换工作区?',
'managed.workspaceSwitchDescription': '切换后相对目录将重置为工作区根目录。',
'managed.workspaceKeep': '保留原选择',
'managed.workspaceSwitch': '切换',
'managed.phase.admitted': '已接收',
'managed.phase.runtime_starting': '环境准备中',
'managed.phase.agent_running': '思考/生成中',
'managed.phase.waiting_runtime': '等待执行环境',
'managed.phase.tool_running': '执行工具中',
'managed.phase.cancelling': '取消中',
'managed.phase.completed': '已完成',
'managed.phase.failed': '失败',
'managed.phase.cancelled': '已取消',
'managed.runtime.unknown': '未知',
'managed.runtime.starting': '准备中',
'managed.runtime.ready': '已就绪',
'managed.runtime.failed': '准备失败',
'git.currentBranch': (v) => `当前 Git 分支:${v?.branch ?? ''}`,
'git.detached': '游离 HEAD',
'git.clean': '工作区干净',
'git.operation.merge': '合并中',
'git.operation.rebase': '变基中',
'git.operation.cherry-pick': '拣选中',
'git.operation.revert': '回退中',
'git.operation.bisect': '二分中',
'git.conflicted': (v) => `${v?.count ?? 0} 个冲突`,
'git.staged': (v) => `${v?.count ?? 0} 已暂存`,
'git.unstaged': (v) => `${v?.count ?? 0} 已修改`,
'git.untracked': (v) => `${v?.count ?? 0} 未跟踪`,
'git.ahead': (v) => `领先 ${v?.count ?? 0}`,
'git.behind': (v) => `落后 ${v?.count ?? 0}`,
'git.stash': (v) => `${v?.count ?? 0} 个 stash`,
'branchPicker.label': 'Git',
'branchPicker.search': '搜索分支和操作',
'branchPicker.loading': '加载分支中…',
'branchPicker.noBranches': '无分支',
'branchPicker.noTags': '无标签',
'branchPicker.action.pull': '更新项目',
'branchPicker.action.push': '推送',
'branchPicker.action.commit': '提交',
'branchPicker.action.newBranch': '新建分支…',
'branchPicker.action.checkoutRef': '检出标签或修订…',
'branchPicker.action.viewChanges': '查看变更',
'branchPicker.action.worktrees': '管理 Worktree…',
'branchPicker.action.history': '提交历史',
'branchPicker.newBranchPlaceholder': '分支名称',
'branchPicker.invalidBranchName':
'无效的分支名称 — 避免空格、~、^、:、? * 以及以 - 开头',
'branchPicker.checkoutRefPlaceholder': '标签名或提交 SHA',
'branchPicker.section.recent': '最近',
'branchPicker.section.local': '本地',
'branchPicker.section.remote': '远程',
'branchPicker.section.tags': '标签',
'branchPicker.checkedOut': (v) => `已检出 ${v?.branch ?? ''}`,
'branchPicker.createdBranch': (v) => `已创建分支 ${v?.branch ?? ''}`,
'branchPicker.pushSuccess': '推送成功',
'branchPicker.pullSuccess': '更新成功',
'branchPicker.pullBlocked': '存在未提交的修改,无法更新',
'branchPicker.pullStash': 'Stash 修改并更新',
'branchPicker.pullDiscard': '放弃修改并更新…',
'branchPicker.pullDiscardConfirm':
'将放弃所有未提交的修改(包括未跟踪文件),此操作无法撤销。',
'branchPicker.pullDiscardGo': '放弃并更新',
'branchPicker.pullStashConflict': (v) =>
`更新成功,但恢复 Stash 中的修改失败。修改仍保留在 Stash 条目 ${String(v?.sha ?? '').slice(0, 12) || '(见 git stash list)'} 中 —— 请先解决冲突标记,再手动恢复。`,
'branchPicker.cancel': '取消',
'branchPicker.hint.upToDate': '已是最新',
'branchPicker.hint.noUpstream': '无上游分支',
'branchPicker.hint.upstreamGone': '上游分支已不存在',
'branchPicker.hint.behindDirty': (v) => `↓${v?.count ?? 0} · 有未提交更改`,
'branchPicker.hint.setsUpstream': '推送时设置上游',
'branchPicker.hint.createsPushBranch': (v) => `将创建 ${v?.target ?? ''}`,
'branchPicker.hint.aheadBehind': (v) =>
`↑${v?.ahead ?? 0} ↓${v?.behind ?? 0} · 已分叉`,
'branchPicker.hint.nothingToPush': '无待推送',
'branchPicker.hint.noChanges': '无更改',
'branchPicker.hint.changes': (v) => `${v?.count ?? 0} 处更改`,
'branchPicker.hint.changesUntracked': (v) =>
`${v?.count ?? 0} 处更改(${v?.untracked ?? 0} 未跟踪)`,
'branchPicker.action.manageRemotes': '管理远程仓库…',
'branchPicker.remotes.title': '远程仓库',
'branchPicker.remotes.back': '返回分支列表',
'branchPicker.remotes.loading': '加载远程仓库中…',
'branchPicker.remotes.empty': '未配置远程仓库',
'branchPicker.remotes.noMatches': '没有匹配的远程仓库',
'branchPicker.remotes.namePlaceholder': '名称',
'branchPicker.remotes.urlPlaceholder': 'URL',
'branchPicker.remotes.add': '添加',
'branchPicker.remotes.remove': (v) => `移除 ${v?.name ?? ''}`,
'branchPicker.remotes.removeConfirm': '确认',
'branchPicker.remotes.removeConfirmFor': (v) =>
`确认移除 ${v?.name ?? ''}${v?.extras ? `(${v.extras})` : ''}`,
'branchPicker.remotes.invisibleName': '(不可见名称)',
'branchPicker.remotes.hiddenChars': '(隐藏字符)',
'branchPicker.remotes.lookalikeName': '(易混名称)',
'branchPicker.remotes.searchPlaceholder': '搜索远程仓库',
'branchPicker.remotes.urlTooltipFetch': (v) => `拉取: ${v?.url ?? ''}`,
'branchPicker.remotes.urlTooltipPush': (v) => `推送: ${v?.url ?? ''}`,
'branchPicker.remotes.promisor': '部分克隆',
'branchPicker.remotes.partialClone': (v) => `部分克隆(${v?.filter})`,
'branchPicker.remotes.customRefspec': '自定义 refspec',
'branchPicker.remotes.extraUrls': (v) => `+${v?.count ?? 0} 个 URL`,
'branchPicker.remotes.otherSettings': (v) => `其他 ${v?.count ?? 0} 项设置`,
'branchPicker.remotes.added': (v) => `已添加远程仓库 ${v?.name ?? ''}`,
'branchPicker.remotes.removed': (v) => `已移除远程仓库 ${v?.name ?? ''}`,
'branchPicker.remotes.invalidInput':
'请输入远程仓库名称和 URL(不能以 - 开头)',
'gitCommit.title': '提交',
'gitCommit.messagePlaceholder': '提交信息(⌘/Ctrl+Enter 提交)',
'gitCommit.generating': '正在生成提交信息…',
'gitCommit.genFailed': '自动生成失败 — 请手动输入提交信息',
'gitCommit.prLogUnavailable': '无法加载所选目标分支的提交记录。',
'gitCommit.prPushFirst': '请先将分支推送到远程仓库,再创建合并请求。',
'gitCommit.commit': '提交',
'gitCommit.commitAndPush': '提交并推送',
'gitCommit.createPr': '创建合并请求',
'gitCommit.prTitlePlaceholder': '合并请求标题',
'gitCommit.prBodyPlaceholder': '描述(可选)',
'gitCommit.prEdit': '编辑',
'gitCommit.prPreview': '预览',
'gitCommit.prSubmit': '创建',
'gitCommit.prCreated': (v) => `合并请求 #${v?.number ?? ''} 已创建`,
'gitCommit.commitSuccess': (v) => `已提交 ${v?.sha ?? ''}`,
'gitCommit.commitPushSuccess': (v) => `已提交并推送 ${v?.sha ?? ''}`,
'gitCommit.commitSuccessPushFailed': (v) =>
`已提交 ${v?.sha ?? ''} — 推送失败:${v?.error ?? '未知错误'}`,
'branchSelect.baseBranch': '目标分支',
'branchSelect.search': '搜索分支…',
'branchSelect.loading': '加载中…',
'branchSelect.noMatches': '无匹配',
'branchSelect.error': '分支加载失败',
'branchSelect.retry': '重试',
'branchSelect.local': '本地',
'gitDiff.title': '变更',
'gitDiff.summary': (v) =>
`${v?.count ?? 0} 个文件 · +${v?.added ?? 0} −${v?.removed ?? 0}`,
'gitDiff.loading': '加载变更中…',
'gitDiff.empty': '工作区无变更',
'gitDiff.unavailable': '此工作区无 Git',
'gitDiff.error': '加载变更失败',
'gitDiff.binary': '二进制',
'gitDiff.untracked': '未跟踪',
'gitDiff.deleted': '已删除',
'gitDiff.noDiff': '无差异可显示',
'gitDiff.fileError': '加载此差异失败',
'gitDiff.truncated': '差异已截断——文件过大,未完整显示',
'gitDiff.hidden': (v) => `还有 ${v?.count ?? 0} 个文件未显示`,
'gitDiff.expand': (v) => `显示 ${v?.path ?? '文件'} 的变更`,
'gitDiff.collapse': (v) => `隐藏 ${v?.path ?? '文件'} 的变更`,
'gitMode.title': 'Git 模式',
'gitMode.current': '当前分支',
'gitMode.currentDesc': (v) => `直接在 ${v?.branch ?? 'main'} 上开发`,
'gitMode.branch': '新建分支',
'gitMode.branchDesc': (v) => `从 ${v?.branch ?? 'main'} 创建新分支`,
'gitMode.branchPlaceholder': 'feat/my-feature',
'gitMode.branchLabel': '分支名',
'gitMode.branchConflictWarning': '同一 workspace 同时只能有一个分支会话',
'gitMode.branchHint': '在工作目录中切换到新分支',
'gitMode.branchInvalidName': '分支名不合法',
'gitMode.worktree': 'Worktree 隔离',
'gitMode.worktreeDesc': '发送首条消息时自动创建独立副本',
'gitMode.confirmBranch': '创建分支',
'gitMode.resetToCurrent': '恢复当前分支',
'gitLog.title': '提交历史',
'gitLog.subtitle': (v) => `${v?.count ?? 0} 条提交`,
'gitLog.loading': '加载历史中…',
'gitLog.empty': '暂无提交',
'gitLog.unavailable': '此工作区不可用 Git',
'gitLog.error': '加载历史失败',
'gitLog.loadMore': '加载更多',
'gitLog.loadingMore': '加载中…',
'gitLog.files': (v) =>
`${v?.count ?? 0} 个文件 · +${v?.added ?? 0} −${v?.removed ?? 0}`,
'gitLog.detailError': '加载提交详情失败',
'gitLog.hidden': (v) => `还有 ${v?.count ?? 0} 个文件未显示`,
'gitLog.copySha': (v) => `复制提交 ${v?.sha ?? ''}`,
'gitLog.allBranches': '全部分支',
'gitLog.search': '搜索提交信息、作者或哈希',
'gitLog.noMatches': '没有匹配的提交',
'gitWorktrees.title': 'Worktree',
'gitWorktrees.subtitle': (v) => `${v?.count ?? 0} 个 worktree`,
'gitWorktrees.loading': '加载 worktree 中…',
'gitWorktrees.error': '加载 worktree 失败',
'gitWorktrees.unavailable': '此工作区不可用 Git',
'gitWorktrees.empty': '没有 worktree',
'gitWorktrees.noMatches': '没有匹配的 worktree',
'gitWorktrees.filter': '按路径或分支过滤',
'gitWorktrees.newSession': '新建 worktree 会话…',
'gitWorktrees.main': '主工作树',
'gitWorktrees.current': '当前工作区',
'gitWorktrees.detached': '游离 HEAD',
'gitWorktrees.bare': '裸仓库',
'gitWorktrees.locked': '已锁定',
'gitWorktrees.prunable': '已失效',
'gitWorktrees.clean': '干净',
'gitWorktrees.dirty': (v) => `${v?.count ?? 0} 处改动`,
'gitWorktrees.statusError': '状态不可用',
'gitWorktrees.remove': '删除',
'gitWorktrees.removeLabel': (v) => `删除 worktree ${v?.name ?? ''}`,
'gitWorktrees.removing': '删除中…',
'gitWorktrees.cancel': '取消',
'gitWorktrees.confirm': '删除这个 worktree?其目录会从磁盘删除,分支保留。',
'gitWorktrees.confirmStale':
'删除这个已失效条目?Git 将不再跟踪它已经找不到的 worktree。目录里剩下的东西会保留,但 git 为它保存的记录不会。',
'gitWorktrees.confirmDetached':
'删除这个 worktree?其目录会从磁盘删除。它处于游离 HEAD,因此没有分支可留。',
'gitWorktrees.blockedDirty': (v) => `${v?.count ?? 0} 处未提交改动将被丢弃。`,
'gitWorktrees.blockedInUse': (v) =>
`${v?.count ?? 0} 个运行中的会话将失去其检出。`,
'gitWorktrees.blockedInUseUnknown': (v) =>
`无法读取 ${v?.count ?? 0} 个运行中会话所在的位置。若有会话在这里,将失去其检出。`,
'gitWorktrees.blockedUnknown':
'无法检查该工作树是否有未提交改动,若有也将一并丢弃。',
'gitWorktrees.blockedOperation': (v) =>
`尚未完成的 ${v?.operation ?? 'git'} 操作将会丢失。`,
'gitWorktrees.blockedUnmerged': (v) =>
`没有分支保住这里的提交;${String(v?.head ?? '').slice(0, 7)} 将被 git 回收。`,
'gitWorktrees.blockedLocked': (v) =>
v?.reason ? `该 worktree 已加锁:${v.reason}` : '该 worktree 已加锁。',
'gitWorktrees.blockedRefused': 'Git 拒绝删除这个 worktree。',
'gitWorktrees.blockedWorkspaceHere': (v) =>
v?.name
? `工作区 ${v.name} 就在这个 worktree 里,删掉它会把该工作区一并带走。请先移除该工作区。`
: '有已注册的工作区就在这个 worktree 里,删掉它会把该工作区一并带走。请先移除该工作区。',
'gitWorktrees.blockedSubmodules':
'该 worktree 的子模块有自己的仓库,删除这个 worktree 会把那个仓库一并删掉。',
'gitWorktrees.blockedSubmodulesUnknown':
'无法确认该 worktree 的子模块是否有自己的仓库。如果有,删除这个 worktree 会把它一并删掉。',
'gitWorktrees.refreshFailed': '列表未能刷新,可能已过时。',
'gitWorktrees.removeAnyway': '仍然删除',
'gitWorktrees.removeFailed': '删除 worktree 失败',
'gitWorktrees.keptDirectory': (v) =>
`Git 已不再跟踪 ${v?.name ?? ''},但它的目录仍在磁盘上。`,
'gitWorktrees.refusedElsewhere': (v) =>
v?.reason
? `你看向别处时,删除 ${v?.name ?? ''} 被拒绝了:${v.reason}`
: `你看向别处时,删除 ${v?.name ?? ''} 被拒绝了。`,
'githubPrs.title': '拉取请求',
'githubPrs.subtitle': (v) => `${v?.count ?? 0} 个开放`,
'githubPrs.loading': '加载拉取请求中…',
'githubPrs.empty': '没有开放的拉取请求',
'githubPrs.unavailable': '当前工作区不是 git 仓库',
'githubPrs.error': '加载拉取请求失败',
'githubPrs.cliUnavailable':
'daemon 所在主机未安装 GitHub CLI(gh)。\n请先安装并运行 `gh auth login`,然后重试。',
'githubPrs.reviewApproved': '已批准',
'githubPrs.reviewChanges': '要求修改',
'githubPrs.reviewRequired': '需要审查',
'githubPrs.checksPassing': '检查通过',
'githubPrs.checksFailing': '检查失败',
'githubPrs.checksPending': '检查进行中',
'githubPrs.open': (v) => `在 GitHub 上打开拉取请求 #${v?.number ?? ''}`,
'workspace.paneLabel': (v) => `工作区:${v?.name ?? ''}`,
// Tool display names (chat-stream badge labels). Keyed by `toolName.<wire>`;
// a wire name with no entry here falls back to the English display name via
// `localizeToolDisplayName`. Acronyms and product names stay verbatim.
'toolName.exec': '执行代码',
'toolName.edit': '编辑文件',
'toolName.write_file': '写入文件',
'toolName.read_file': '读取文件',
'toolName.zoom_image': '图片放大',
'toolName.grep': '搜索内容',
'toolName.grep_search': '搜索内容',
'toolName.glob': '查找文件',
'toolName.run_shell_command': '运行命令',
'toolName.todo_write': '任务清单',
'toolName.get_goal': '目标',
'toolName.update_goal': '更新目标',
'toolName.propose_goal': '提议目标',
'toolName.save_memory': '保存记忆',
'toolName.manage_memory': '管理记忆',
'toolName.search_memory': '搜索记忆',
'toolName.agent': '智能体',
'toolName.advisor': '审查模型',
'toolName.skill': '查看技能',
'toolName.enter_plan_mode': '进入计划模式',
'toolName.exit_plan_mode': '退出计划模式',
'toolName.web_fetch': '网络搜索',
'toolName.webfetch': '网络搜索',
'toolName.fetch': '网络搜索',
'toolName.web_search': '网络搜索',
'toolName.list_directory': '列出文件',
'toolName.lsp': 'LSP',
'toolName.ask_user_question': '询问用户',
'toolName.cron_create': '创建定时任务',
'toolName.cron_list': '定时任务列表',
'toolName.cron_delete': '删除定时任务',
'toolName.task_create': '创建任务',
'toolName.task_update': '更新任务',
'toolName.task_list': '任务列表',
'toolName.task_stop': '停止任务',
'toolName.team_create': '创建团队',
'toolName.team_delete': '删除团队',
'toolName.send_message': '发送消息',
'toolName.request_shutdown': '请求下线',
'toolName.list_agents': '列出 Agent',
'toolName.structured_output': '结构化输出',
'toolName.monitor': '监控',
'toolName.notebook_edit': '编辑 Notebook',
'toolName.tool_call': '工具调用',
'toolName.tool_search': '工具搜索',
'toolName.enter_worktree': '进入 Worktree',
'toolName.exit_worktree': '退出 Worktree',
'toolName.workflow': '工作流',
'toolName.team_plan_approval': '团队计划审批',
'toolName.loop_wakeup': '循环唤醒',
'toolName.create_sub_session': '创建子会话',
'toolName.read_mcp_resource': '读取 MCP 资源',
'toolName.artifact': '制品',
'toolName.record_artifact': '记录制品',
'toolName.record_source': '记录来源',
'toolName.report_findings': '上报评审发现',
'toolName.image_gen': '生成图片',
'toolName.omni_downsample_image': '降采样图像',
'toolName.omni_downscale_video': '降采样视频',
'toolName.omni_downsample_audio': '降采样音频',
'toolName.omni_extract_keyframes': '提取关键帧',
'toolName.omni_extract_audio': '提取音轨',
'toolName.omni_clip_video': '剪辑视频',
'toolName.omni_clip_image': '裁剪图像',
'toolName.omni_clip_audio': '剪辑音频',
'toolName.omni_caption_image': '描述图像',
'toolName.omni_caption_audio': '描述音频',
'toolName.omni_ocr_image': '识别图像文字',
'toolName.omni_understand_video_segments': '分段理解视频',
'toolName.omni_convert_image': '转换图像',
'toolName.omni_transcribe_audio': '转写音频',
'toolName.omni_recall_media_memory': '召回媒体记忆',
'toolName.display_image': '显示图片',
// web-shell-only wire aliases (see TOOL_DISPLAY_NAMES in toolFormatting.ts)
'toolName.bash': '运行命令',
'toolName.shell': 'Shell 命令',
'toolName.read': '读取文件',
'toolName.readfile': '读取文件',
'toolName.write': '写入文件',
'toolName.writefile': '写入文件',
'toolName.search': '搜索内容',
'toolName.todowrite': '任务清单',
'toolName.savememory': '保存记忆',
'toolName.askuserquestion': '询问用户',
'toolName.toolsearch': '工具搜索',
'about.auth': '认证',
'about.baseUrl': 'Base URL',
'about.fastModel': '快速模型',
'about.memoryUsage': '内存使用',
'about.model': '模型',
'about.noProxy': 'no proxy',
'about.noSandbox': 'no sandbox',
'about.platform': '操作系统',
'about.proxy': '代理',
'about.runtime': '运行环境',
'about.sandbox': '沙箱',
'about.sessionId': '会话 ID',
'about.title': '状态',
'agent.back': '返回',
'agent.builtInBadge': '(内置)',
'agent.action.delete': '删除智能体',
'agent.action.edit': '编辑智能体',
'agent.action.view': '查看智能体',
'agent.chooseAction': (v) => `选择操作:${v?.name ?? ''}`,
'agent.chooseActionTitle': '选择操作',
'agent.colorLabel': '颜色:',
'agent.colorUpdated': (v) => `已更新 ${v?.name ?? ''} 的颜色`,
'agent.create': '创建新的智能体',
'agent.create.button': '创建',
'agent.create.confirm': '确认并保存',
'agent.create.desc': '创建新的智能体',
'agent.create.descPlaceholder': '这个智能体做什么?',
'agent.create.describeAgent': '描述需求',
'agent.create.description': '描述',
'agent.create.editAgain': '编辑',
'agent.create.enterDescription': '输入描述',
'agent.create.enterName': '输入子智能体名称',
'agent.create.enterPrompt': '输入系统提示词',
'agent.create.generateFailed': (v) =>
`生成子智能体失败:${v?.error ?? '未知错误'}`,
'agent.create.generate': '生成',
'agent.create.generatedDescription': '描述',
'agent.create.generatedSystemPrompt': '系统提示词',
'agent.create.generatingConfig': '正在生成子智能体配置...',
'agent.create.generatingPrompt': '生成中...',
'agent.create.loading': '创建中...',
'agent.create.location': '选择位置',
'agent.create.method': '选择生成方式',
'agent.create.method.manual': '手动创建',
'agent.create.method.qwen': '使用 Qwen Code 生成',
'agent.create.method.qwen.recommended': '使用 Qwen Code 生成(推荐)',
'agent.create.method.qwen.desc': 'LLM 生成描述和系统提示词',
'agent.create.name': '名称',
'agent.create.namePlaceholder': 'my-agent',
'agent.create.nameHelp': '输入此子智能体清晰且唯一的名称。',
'agent.create.project': '项目',
'agent.create.project.cli': '工作区',
'agent.create.project.desc': '创建项目级智能体',
'agent.create.prompt': '系统提示词',
'agent.create.promptPlaceholder': '你是一个专门的智能体...',
'agent.create.promptPlaceholder.cli': '例如:你是一名专业的代码审查员...',
'agent.create.promptHelp':
'编写定义此子智能体行为的系统提示词。为了获得最佳效果,请全面描述。',
'agent.create.preview': '预览',
'agent.create.qwenHint':
'说明职责、使用场景和重要约束,然后分别生成各项内容。',
'agent.create.qwenPlaceholder':
'> 例如:专业的代码审查员,根据最佳实践审查代码...',
'agent.create.regenerate': '重新生成草稿',
'agent.create.required': '名称、描述和系统提示词均为必填项。',
'agent.create.tools': '允许的工具',
'agent.create.toolsHelp':
'使用逗号或换行分隔 canonical 工具名称;MCP 工具使用 mcp__server__tool,留空表示继承全部工具。',
'agent.create.disallowedTools': '禁用的工具',
'agent.create.model': '模型',
'agent.create.approvalMode': '审批模式',
'agent.create.maxTurns': '最大执行轮次',
'agent.create.maxTurnsHelp':
'限制智能体完成单次任务时的模型调用轮数,达到上限后将停止执行。留空表示不设置智能体层级的限制。',
'agent.create.maxTurnsInvalid': '最大执行轮次必须是正整数。',
'agent.create.mcpServers': 'MCP Server',
'agent.create.mcpServers.empty': '暂无可用的 MCP Server。',
'agent.create.mcpServers.select': '选择 MCP Server',
'agent.create.mcpServers.noneSelected': '尚未选择 MCP Server。',
'agent.create.modelGenerate': '模型生成',
'agent.create.modelGenerate.description':
'描述你的需求,然后分别生成并检查描述和系统提示词。',
'agent.create.color': '颜色',
'agent.create.jsonObjectHelp': '请输入 JSON 对象,或留空。',
'agent.create.save': '保存智能体',
'agent.create.scope': '类别',
'agent.create.manualDescHelp': '描述此子智能体应该在何时以及如何使用。',
'agent.create.manualDescPlaceholder':
'例如:根据最佳实践和潜在 bug 审查代码。',
'agent.create.tools.builtin': '内置工具',
'agent.create.tools.empty': '暂无可用工具。',
'agent.create.tools.mcp': 'MCP 工具',
'agent.create.tools.type': '工具类型',
'agent.create.tools.selectServer': '选择 MCP Server',
'agent.create.tools.selectTool': '选择工具',
'agent.create.tools.noneSelected': '尚未选择工具。',
'agent.create.tools.initializing': '正在初始化工具目录...',
'agent.create.tools.preheatFailed': 'ACP 预热未完成。',
'agent.create.tools.loadFailed': '内置工具加载失败。',
'agent.create.removeSelection': (v) => `移除 ${v?.name ?? ''}`,
'agent.create.toolsSelectHelp':
'选择此子智能体可以使用的工具;全部不选表示继承所有工具。',
'agent.create.toolsSelection': '选择工具',
'agent.create.tools.all': '所有工具',
'agent.create.tools.allDefault': '所有工具(默认)',
'agent.create.tools.allInfo': '已选择所有工具,包括 MCP 工具',
'agent.create.tools.allInfoFallback': '已选择所有工具,包括 MCP 工具',
'agent.create.tools.editLabel': '• 编辑工具:',
'agent.create.tools.executionLabel': '• 执行工具:',
'agent.create.tools.none': '(无)',
'agent.create.tools.readEdit': '读取和编辑工具',
'agent.create.tools.readEditExecute': '读取、编辑和执行工具',
'agent.create.tools.readOnlyLabel': '• 只读工具:',
'agent.create.tools.readOnly': '只读工具',
'agent.create.tools.selected': '已选择的工具:',
'agent.create.user': '用户',
'agent.create.user.cli': '全局',
'agent.create.user.desc': '创建用户级智能体',
'agent.create.useGenerated': '确认使用',
'agent.approval.inherit': '默认',
'agent.approval.default': '默认审批',
'agent.approval.plan': '仅规划',
'agent.approval.auto-edit': '自动批准编辑',
'agent.approval.yolo': '自动批准所有操作',
'agent.approval.bubble': '气泡审批',
'agent.approval.desc.inherit': '使用智能体默认的审批规则。',
'agent.approval.desc.bubble': '将工具审批请求转交给父会话处理。',
'agent.createFirstHint': "使用 '/agents create' 创建第一个智能体。",
'agent.created': (v) => `已创建 ${v?.name ?? ''}`,
'agent.edit.save': '保存修改',
'agent.updated': (v) => `已更新 ${v?.name ?? ''}`,
'agent.turnsBadge': (v) => `${v?.count ?? 0} 轮`,
'agent.delete': '删除',
'agent.delete.confirm': (v) => `确定要删除 "${v?.name ?? ''}" 吗?`,
'agent.delete.loading': '删除中...',
'agent.delete.no': '否',
'agent.delete.title': (v) => `删除 ${v?.name ?? ''}`,
'agent.delete.yes': '是,删除',
'agent.deleted': (v) => `已删除 ${v?.name ?? ''}`,
'agent.edit': '编辑',
'agent.edit.color': '编辑颜色',
'agent.edit.tools': '编辑工具',
'agent.editColorTitle': (v) => `编辑颜色:${v?.name ?? ''}`,
'agent.editTitle': (v) => `编辑 ${v?.name ?? ''}`,
'agent.empty': '未找到智能体。',
'agent.noMatches': '未找到匹配的智能体。',
'agent.footer.back': 'Esc 返回',
'agent.footer.cliBack': 'Enter 选择 · ↑↓ 导航 · Esc 返回',
'agent.footer.cliSelect': 'Enter 选择 · ↑↓ 导航 · Esc 关闭',
'agent.footer.close': 'Esc 关闭',
'agent.footer.deleteConfirm': 'Enter 确认,Esc 取消',
'agent.footer.enterNext': '按 Enter 继续,Esc 返回',
'agent.footer.generating': 'Esc 取消',
'agent.footer.createLocation': '按 Enter 继续,↑↓ 导航,Esc 取消',
'agent.footer.createContinue': '按 Enter 继续,↑↓ 导航,Esc 返回',
'agent.footer.final': '按 Enter 保存,e 保存并编辑,Esc 返回',
'agent.footer.nav': '↑↓ 导航 · Enter 选择 · Esc 返回',
'agent.footer.navBack': '↑↓ 导航 · Enter 选择 · Esc 返回',
'agent.footer.navSelect': '↑↓ 导航 · Enter 选择 · Esc 关闭',
'agent.footer.viewerBack': 'Esc 返回',
'agent.filePathLabel': '文件路径:',
'agent.label': '智能体',
'agent.location': '位置',
'agent.level.builtin': '内置',
'agent.level.extension': '扩展',
'agent.level.project': '项目',
'agent.level.user': '用户',
'agent.level.filter': '按智能体级别筛选',
'agent.manage': '管理',
'agent.manage.desc': '管理已有智能体',
'agent.modelLabel': '模型:',
'agent.overriddenBadge': '(已被项目级智能体覆盖)',
'agent.readonly': '该智能体是只读的。',
'agent.select': '请选择一个智能体。',
'agent.selectAction': '选择操作',
'agent.descriptionLabel': '描述:',
'agent.systemPromptLabel': '系统提示词:',
'agent.level.label': '级别',
'agent.step': (v) => `步骤 ${v?.n ?? ''}`,
'agent.tools': '工具',
'agent.toolsLabel': '工具:',
'agent.detail.overview': '基本信息',
'agent.detail.tools': '工具',
'agent.detail.mcp': 'MCP',
'agent.detail.hooks': 'Hooks',
'agent.detail.systemPrompt': '系统提示词',
'agent.toolsUpdated': (v) => `已更新 ${v?.name ?? ''} 的工具`,
'agent.usingCount': (v) => `使用中:${v?.count ?? 0} 个智能体`,
'agent.view': '查看',
'agents.closed': '智能体面板已关闭。',
'agents.title': '智能体',
'subagent.result': '结果',
'subagent.tools': (v) => `工具 (${v?.count ?? 0})`,
'subagent.toolsCount': (v) => `${v?.count ?? 0} 个工具`,
'subagent.toggleStream': '展开/收起子智能体详情',
'subagent.creating': '创建中',
'subagent.pending': '等待中',
'subagent.running': '运行中',
'subagent.background': '后台任务',
'subagent.completed': '已完成',
'subagent.failed': '失败',
'subagent.cancelled': '已取消',
'subagent.paused': '已暂停',
'subagent.detailsLoading': '正在加载子智能体详情…',
'subagent.detailsLoadFailed': '子智能体详情加载失败。',
'agentType.general-purpose': '通用',
'agentType.explore': '探索',
'agentType.statusline-setup': '状态栏设置',
'agentType.review-agent': '代码评审',
'agentType.test-engineer': '测试工程师',
'agentType.fork': '分支',
'timeline.parallelAgents': '并行智能体',
'timeline.thinking': '思考',
'timeline.assistantUpdate': '助手更新',
'timeline.toolCalls': (v) => `${v?.count ?? 0} 个工具调用`,
'timeline.planUpdate': '计划更新',
'timeline.statusUpdate': '状态更新',
'timeline.userTurn': '用户轮次',
'timeline.planDetail': '计划更新',
'timeline.parallelAgentsDetail': (v) => `${v?.count ?? 0} 个并行智能体`,
'timeline.noActivity': '无活动',
'timeline.sessionTimeline': '会话时间线',
'timeline.turnPrefix': (v) => `第 ${v?.index ?? 0} 轮`,
'timeline.currentTurn': '当前轮次',
'timeline.kind.thought': '思考',
'timeline.kind.commentary': '助手更新',
'timeline.kind.tool': '工具调用',
'timeline.kind.agents': '并行智能体',
'timeline.kind.plan': '计划更新',
'timeline.kind.status': '状态更新',
'timeline.kind.none': '轮次',
'common.copy': '复制',
'common.download': '下载',
'common.downloading': '正在下载…',
'common.downloadFailed': (v) => `下载失败:${v?.message ?? ''}`,
'common.open': '打开',
'common.openFailed': (v) => `无法打开链接:${v?.message ?? ''}`,
'excel.worksheet': '工作表',
'excel.row': '行',
'excel.truncated': (v) =>
`每个工作表最多预览 ${v?.cells} 个单元格。下载原文件查看全部内容。`,
'excel.previousWorksheets': '上一组工作表',
'excel.nextWorksheets': '下一组工作表',
'excel.empty': '此工作表为空。',
'excel.notCalculated': '未计算',
'excel.tooLarge': 'Excel 预览支持最大 10 MiB 的文件,请下载原文件打开。',
'excel.invalid':
'无法预览此工作簿,文件可能已损坏、受密码保护、复杂度过高,或当前浏览器不支持。你可以下载原文件。',
'excel.timeout': '工作簿预览超时,请下载原文件打开。',
'artifact.openLink': '打开链接',
'artifact.longDocument': '文件过大,默认展示源码。',
'artifact.renderFullPreview': '完整排版预览',
'artifact.registrationFailed': (v) => `无法添加导出文件:${v?.message ?? ''}`,
'artifact.previewFailed': (v) => `无法加载预览:${v?.message ?? ''}`,
'artifact.showSource': '显示源码',
'common.na': '不适用',
'common.server': '服务器',
'common.agent': '智能体',
'common.auto': '自动',
'common.runtime': '运行时',
'common.failedToLoad': '加载失败',
'auth.notSet': '(未设置)',
'auth.apiKeyPlaceholder': 'sk-...',
'auth.modelsPlaceholder': '模型ID-1, 模型ID-2',
'model.usingModel': (v) =>
`正在使用${v?.isRuntime ? '运行时' : ''}模型:${v?.modelId ?? ''}`,
'mermaid.label': 'mermaid',
'mermaid.errorLabel': 'mermaid(错误)',
'user.uploadedImage': (v) => `用户上传的图片 ${v?.index ?? 1}`,
'resume.failedToLoad': '加载会话失败',
'toast.dismiss': '关闭通知',
'toast.dismissShort': '关闭',
'insight.ready': 'Insight 报告已生成!',
'request.cancelled': '请求已取消。',
'visionBridge.model': '视觉模型',
'visionBridge.skipped': (v) =>
`视觉桥接已取消。${v?.egressOccurred === 1 ? `你的图片及提示词/上下文已发送至 ${v?.target ?? ''}。` : ''}`,
'visionBridge.failed': (v) =>
v?.egressOccurred === 1
? `视觉桥接(${v?.modelName ?? ''})失败:视觉模型请求失败。你的图片及提示词/上下文已发送至 ${v?.target ?? ''}。图片未被解析。`
: `视觉桥接(${v?.target ?? ''})失败:视觉桥接无法运行。图片未被解析。`,
'visionBridge.ok': (v) =>
`已通过 ${v?.target ?? ''} 将 ${v?.convertedCount ?? 0} 张图片转换为文本${Number(v?.omittedCount ?? 0) > 0 ? `(已忽略 ${v?.omittedCount ?? 0} 张图片)` : ''}。${v?.egressOccurred === 1 ? '你的图片及提示词/上下文已发送至该模型。' : ''}`,
'approval.goal.title': '确认会话目标',
'approval.goal.overview': '目标概览',
'approval.goal.full': '完整内容',
'approval.goal.outcome': '目标',
'approval.goal.doneWhen': '完成条件',
'approval.goal.mustNot': '执行边界',
'approval.goal.budget': '预算',
'approval.goal.onBlock': '遇到阻塞时',
'approval.goal.context': '上下文',
'approval.goal.confirm': '设置并继续',
'approval.goal.reject': '暂不设置',
'approval.goal.hint':
'设置后将继续执行,并在每轮结束时检查目标进展;遇到阻塞会说明原因。',
'approval.goal.pending': '正在提交…',
'approval.goal.failed': '提交失败,请重试。',
'approval.execQuestion': (v) => `允许执行:'${v?.tool ?? ''}'?`,
'approval.changeQuestion': '是否继续?',
'approval.launchAgentQuestion': '启动这个 agent?',
'approval.explain': '解释',
'approval.explanation': '命令解释',
'approval.explaining': '正在解释…',
'approval.explanationThinking': '思考中…',
'approval.explanationFailed': '解释失败',
'approval.reExplain': '重新解释',
'approval.option.allowOnce': '是,允许一次',
'approval.option.allowOnceAndSwitchToDefault': '允许一次并切换到默认模式',
'approval.option.restorePrevious': '是,恢复之前的模式',
'approval.option.rejectOnce': '拒绝',
'approval.option.allowAllEdits': '允许所有编辑',
'approval.option.allowAlwaysProject': '项目内始终允许',
'approval.option.allowAlwaysUser': '对此用户始终允许',
'approval.option.allowAlwaysServer': '对此服务始终允许',
'approval.option.allowAlwaysTool': '对此工具始终允许',
'assistant.branch': '分叉',
'assistant.copy': '复制',
'assistant.selectionCopy': '复制所选内容',
'assistant.copyPlainText': '复制纯文本',
'assistant.copyMarkdown': '复制 Markdown',
'assistant.dissatisfied': '不满意',
'assistant.satisfied': '满意',
'agentMessage.status.failed': '失败',
'agentMessage.status.cancelled': '已停止',
'agentMessage.status.offline': 'Runtime 离线',
'agentMessage.tokens': (v) => `${v?.count ?? 0} tokens`,
'agentMessage.steps': '步骤',
'agentMessage.noAction': (v) => `${v?.name ?? ''} 这次无需动作`,
'agentMessage.step.running': '进行中',
'agentMessage.step.completed': '已完成',
'agentMessage.step.failed': '失败',
'agentMessage.step.stopped': '已停止',
'at.category.extensions': '扩展',
'at.category.extensions.description': '引用已启用扩展',
'at.category.files': '文件',
'at.category.files.description': '引用工作区文件',
'at.files.upload': '上传文件',
'at.files.upload.description': '上传文件到此文件夹',
'composer.upload.pending': '等待中',
'composer.upload.uploading': '上传中',
'composer.upload.done': '已上传',
'composer.upload.error': '失败',
'composer.upload.error.noDaemon': '未连接 Daemon',
'composer.upload.error.tooLarge': (v) =>
`文件超过 ${v?.limit ?? ''} 上传上限`,
'composer.upload.error.tooManyFiles': (v) =>
`另有 ${v?.count ?? 0} 个文件未添加(单批数量上限)`,
'composer.upload.cancel': '取消上传',
'composer.upload.dismiss': '关闭',
'composer.upload.renamed': '已保存为',
'composer.upload.drop': '拖放文件',
'composer.dropChoice.title': (v) => `添加拖入的 ${v?.count ?? 0} 个文件`,
'composer.dropChoice.description':
'可作为当前消息的附件供 Agent 读取,或上传到工作区并插入 @ 引用。',
'composer.dropChoice.cancel': '取消',
'composer.dropChoice.upload': '上传到工作区',
'composer.dropChoice.reference': '添加为附件',
'composer.dropChoice.moreFiles': (v) => `另有 ${v?.count ?? 0} 个文件`,
'composerAdd.trigger': '添加到消息',
'composerMobile.expand': '展开编辑',
'composerMobile.hideKeyboard': '收起键盘',
'composerMobile.done': '完成',
'composerMobile.photos': '照片',
'composerMobile.camera': '拍照',
'composerMobile.files': '添加文件附件',
'composerMobile.commands': '全部命令',
'composerMobile.searchCommands': '搜索命令',
'composerMobile.history': '输入历史',
'composerMobile.previousInput': '上一条输入',
'composerMobile.nextInput': '下一条输入',
'composerMobile.stop': '停止',
'composerMobile.attachments': (v) => `已添加附件/图片:${v?.count ?? 0}`,
'composerAdd.emptyState': '此处没有可用的添加操作',
'composerAdd.noResults': '没有结果',
'composerAdd.loadError': '加载失败',
'composerAdd.unavailable': '不可用',
'composerAdd.file.label': '添加文件',
'composerAdd.file.attachDisabled': '当前无法添加消息附件',
'composerAdd.file.uploadDisabled': '当前工作区不可上传',
'composerAdd.referenceFile.label': '引用文件',
'composerAdd.referenceFile.searchPlaceholder': '搜索工作区文件',
'composerAdd.extensions.label': '扩展',
'composerAdd.extensions.empty': '没有已启用的扩展',
'composerAdd.mcp.label': 'MCP',
'composerAdd.mcp.empty': '没有可用的 MCP 服务',
'composerAdd.skills.label': '技能',
'composerAdd.plan.label': '计划模式',
'composerAdd.plan.description': '先出计划,批准后再执行',
'composerAdd.plan.busy': '模式切换中',
'composerAdd.btw.label': '顺带一问',
'composerAdd.btw.description': '临时提问,不打断任务',
'composerAdd.btw.textOnly': '请先移除附件',
'at.category.mcpResources': 'MCP 资源',
'at.category.mcpResources.description': '引用 MCP server 资源',
'at.menu': '引用菜单',
'common.back': '返回',
'common.all': '全部',
'common.add': '添加',
'common.cancel': '取消',
'common.close': '关闭',
'common.fullscreen': '全屏',
'common.exitFullscreen': '退出全屏',
'common.continue': '继续',
'common.current': '当前',
'common.disabled': '已禁用',
'common.enabled': '已启用',
'common.enterSelect': '回车选择',
'common.invalid': '无效',
'common.loading': '加载中...',
'common.retry': '重试',
'session.recovery.interrupted_prompt': '上次请求在回答完成前中断。',
'session.recovery.interrupted_turn': '上次任务已中断,部分工具结果未保存。',
'session.recovery.degraded_history': '会话历史不完整,无法继续中断的任务。',
'session.recovery.continue': '继续执行',
'session.recovery.continuing': '正在继续…',
'session.recovery.failed': '无法继续此会话。',
'session.archived': '该会话已归档',
'session.archivedDescription': '需要先取消归档,才能打开该会话。',
'session.capabilitiesFailed': '无法加载 Daemon 能力。请重试后再打开该会话。',
'session.contextConflict': 'Standalone 或 Live 会话链接不能同时指定工作区。',
'session.loadFailed': '会话加载失败',
'session.notFound': '会话不存在',
'session.notFoundDescription': '该 Standalone 会话已不存在。',
'session.resolving': '正在打开会话...',
'session.standaloneUnavailable': 'Standalone 会话不可用',
'session.standaloneUpgradeRequired':
'请升级 Daemon 后再打开 Standalone 会话。',
'session.stillCreating': '会话仍在创建中,请稍后重试。',
'session.recoveryPending':
'创建可能已成功,但结果尚未确认。为避免重复创建,当前已暂停发送。',
'session.recoveryChecking': '正在检查预留的会话 ID...',
'session.recoveryStillCreating': '会话仍在创建中,请稍后再次检查。',
'session.recoveryAbsent':
'预留 ID 对应的会话不存在,可以显式开始一个新会话。',
'session.recoveryUnknown': '创建结果仍不确定,请再次检查后再开始其他会话。',
'session.recoveryArchived': '恢复到的会话已归档,请先取消归档。',
'session.recoveryCheckFailed': '检查会话创建状态失败',
'session.recoveryBlocksAction':
'请先处理待确认的 Standalone 会话状态,再继续操作。',
'session.checkStatus': '检查状态',
'session.retryCreation': '开始新会话',
'session.writerBlocked':
'其他 Qwen 进程或未解决的写入锁可能阻止该会话访问。请在其他进程中关闭它后重试;若仍失败,请先查看本地 daemon 诊断日志再进行恢复。',
'session.directoryRecreated':
'会话记录已恢复,但之前私有目录中的文件未能恢复。',
'session.directoryMissing': '该会话的私有工作目录缺失,请修复后再发送消息。',
'session.directoryCompromised':
'该私有工作目录存在安全风险,无法自动修复。请先导出会话记录,再删除该会话。',
'session.repair': '修复目录',
'session.repairing': '修复中...',
'session.repairFailed': '修复私有工作目录失败',
'session.repairSucceeded': '私有工作目录已修复。',
'session.unarchive': '取消归档',
'session.unarchiveFailed': '取消归档失败。',
'session.workspaceActionUnavailable': '该操作仅适用于项目会话。',
'common.save': '保存',
'common.navigate': '↑↓ 导航',
'common.next': '下一步',
'common.noResults': '无结果',
'common.previous': '上一步',
'common.expand': '展开',
'common.collapse': '收起',
'common.refresh': '刷新',
'common.search': '搜索',
'common.valid': '有效',
'common.clients': (v) => `${v?.count ?? 0} 个客户端`,
'agent.count': (v) => `${v?.count ?? 0} 个智能体`,
'askUser.submit': '提交',
'askUser.submitting': '提交中...',
'askUser.submitFailed': '提交回答失败',
'askUser.submitOptionUnavailable': '提交选项不可用',
'askUser.ignore': '忽略',
'askUser.multiHint': '可多选',
'askUser.progress': (v) => `${v?.current ?? 0}/${v?.total ?? 0} 个问题`,
'askUser.selectAnswer': '选择一个答案',
'askUser.typePlaceholder': '输入内容...',
'askUser.shortcuts.previous': '← 上一步',
'askUser.shortcuts.optionsSingle': '↑↓ 选择 · Enter 提交',
'askUser.shortcuts.optionsNext': '↑↓ 选择 · Enter 下一步',
'askUser.shortcuts.optionsFinal': '↑↓ 选择 · Enter 提交',
'askUser.shortcuts.multiSingle':
'↑↓ 移动 · Space 选中/取消 · Enter 选中并提交',
'askUser.shortcuts.multiNext':
'↑↓ 移动 · Space 选中/取消 · Enter 选中并下一步',
'askUser.shortcuts.multiFinal':
'↑↓ 移动 · Space 选中/取消 · Enter 选中并提交',
'askUser.shortcuts.customTrigger': '↑↓ 选择 · Enter 编辑',
'askUser.shortcuts.customTriggerMulti': '↑↓ 移动 · Enter 编辑',
'askUser.shortcuts.inputEmpty': '输入答案 · Esc 退出编辑',
'askUser.shortcuts.inputSingle': 'Enter 提交 · Esc 退出编辑',
'askUser.shortcuts.inputNext': 'Enter 下一步 · Esc 退出编辑',
'askUser.shortcuts.inputFinal': 'Enter 提交 · Esc 退出编辑',
'copy.failedFallback': '复制到剪贴板失败',
'copy.inlineLatexMissing': '最后一条 AI 输出中没有匹配的行内 LaTeX 表达式。',
'copy.latexMissing': '最后一条 AI 输出中没有匹配的 LaTeX 块。',
'copy.noOutput': '历史记录中没有可复制的输出',
'copy.noText': '最后一条 AI 输出没有可复制的文本。',
'copy.codeMissing': '最后一条 AI 输出中没有匹配的代码块。',
'copy.outputCopied': '已复制最后一条输出到剪贴板',
'copy.toClipboard': (v) => `${v?.label ?? '内容'} 已复制到剪贴板`,
'code.copy': '复制',
'code.copied': '已复制!',
'echartsChart.noData': '暂无数据',
'echartsChart.tableNotice': (v) => {
const omittedRows = Number(v?.omittedRows ?? 0);
const omittedColumns = Number(v?.omittedColumns ?? 0);
if (omittedRows > 0 && omittedColumns > 0) {
return `显示 ${v?.visibleRows ?? 0}/${v?.totalRows ?? 0} 行,${v?.visibleColumns ?? 0}/${v?.totalColumns ?? 0} 列`;
}
if (omittedColumns > 0) {
return `显示 ${v?.visibleColumns ?? 0}/${v?.totalColumns ?? 0} 列`;
}
return `显示 ${v?.visibleRows ?? 0}/${v?.totalRows ?? 0} 行`;
},
'echartsChart.rendering': '正在渲染图表',
'echartsChart.renderFailed': '图表渲染失败。',
'echartsChart.viewMode': '视图模式',
'echartsChart.showChart': '显示图表',
'echartsChart.showData': '显示数据',
'echartsChart.chart': '图表',
'echartsChart.data': '数据',
'markdownTable.blank': '(空白)',
'markdownTable.column': (v) => `第 ${v?.index ?? ''} 列`,
'markdownTable.rows': (v) => `共${v?.count ?? 0}行`,
'markdownTable.rowsFiltered': (v) => `${v?.visible ?? 0}/${v?.total ?? 0} 行`,
'markdownTable.hint': '点击表头排序,点击 ▾ 打开筛选。',
'markdownTable.filtersActive': (v) => `${v?.count ?? 0} 个筛选`,
'markdownTable.selection.selected': '已选',
'markdownTable.selection.nonEmpty': '非空',
'markdownTable.selection.numeric': '数值',
'markdownTable.selection.sum': '求和',
'markdownTable.selection.average': '平均',
'markdownTable.selection.min': '最小',
'markdownTable.selection.max': '最大',
'markdownTable.copyTsv': '复制 TSV',
'markdownTable.copyTsvHint': '复制为 TSV,可粘贴到 Excel 等表格应用',
'markdownTable.copyVisible': '复制表格',
'markdownTable.customColumns': '自定义列',
'markdownTable.customColumns.tableSection': '显示在表格列的信息',
'markdownTable.customColumns.detailSection': '显示在折叠面板的信息',
'markdownTable.customColumns.toggleAllTable': '切换全部表格列',
'markdownTable.customColumns.toggleAllDetails': '切换全部折叠面板字段',
'markdownTable.customColumns.reset': '重置',
'markdownTable.customColumns.noDetails': '未选择折叠面板字段',
'markdownTable.freezeFirstColumn': '冻结首列',
'markdownTable.unfreezeFirstColumn': '取消冻结首列',
'markdownTable.densityLabel': '表格密度',
'markdownTable.densityCurrent': (v) => `${v?.density ?? ''}密度`,
'markdownTable.density': (v) => `密度:${v?.density ?? ''}`,
'markdownTable.density.standard': '标准',
'markdownTable.density.compact': '紧凑',
'markdownTable.density.comfortable': '舒适',
'markdownTable.expandLongText': '展开文本',
'markdownTable.collapseLongText': '收起文本',
'markdownTable.emptyValue': '(空白)',
'markdownTable.hideColumn': '隐藏列',
'markdownTable.showHiddenColumns': (v) => `显示 ${v?.count ?? 0} 个隐藏列`,
'markdownTable.moveColumn': (v) => `移动 ${v?.column ?? ''}`,
'markdownTable.resizeColumn': (v) => `调整 ${v?.column ?? ''} 列宽`,
'markdownTable.rowDetails': '详情',
'markdownTable.rowDetailsAria': (v) => `查看第 ${v?.index ?? ''} 行详情`,
'markdownTable.closeRowDetailsAria': (v) => `收起第 ${v?.index ?? ''} 行详情`,
'markdownTable.detailsHeader': '单行详情',
'markdownTable.cellDialogTitle': '当前字段值',
'markdownTable.copyCell': '复制',
'markdownTable.close': '关闭',
'markdownTable.actions': '操作',
'markdownTable.sortByColumn': (v) => `按 ${v?.column ?? ''} 排序`,
'markdownTable.sortByColumnAsc': (v) => `${v?.column ?? ''} 已升序排序`,
'markdownTable.sortByColumnDesc': (v) => `${v?.column ?? ''} 已降序排序`,
'markdownTable.filterColumn': (v) => `筛选 ${v?.column ?? ''}`,
'markdownTable.empty': '此表格没有数据。',
'markdownTable.emptyFiltered': '没有符合筛选条件的行。',
'markdownTable.sort.asc': '升序排序',
'markdownTable.sort.desc': '降序排序',
'markdownTable.sort.clear': '清除排序',
'markdownTable.filter.searchPlaceholder': '搜索筛选值',
'markdownTable.filter.searchAria': (v) => `搜索 ${v?.column ?? ''}`,
'markdownTable.filter.selectVisible': '全选当前结果',
'markdownTable.filter.optionLimit': (v) =>
`已显示前 ${v?.count ?? 0} 项,请搜索缩小范围`,
'markdownTable.filter.noOptions': '没有匹配项',
'markdownTable.filter.custom': '自定义筛选',
'markdownTable.filter.numberAria': (v) => `数字筛选 ${v?.column ?? ''}`,
'markdownTable.filter.textAria': (v) => `文本筛选 ${v?.column ?? ''}`,
'markdownTable.filter.numberPlaceholder': '数值',
'markdownTable.filter.toPlaceholder': '到',
'markdownTable.filter.textPlaceholder': '输入筛选条件',
'markdownTable.filter.reset': '重置',
'markdownTable.filter.cancel': '取消',
'markdownTable.filter.confirm': '确认',
'markdownTable.filter.text.contains': '包含',
'markdownTable.filter.text.equals': '等于',
'markdownTable.filter.text.notEquals': '不等于',
'markdownTable.filter.text.startsWith': '开头是',
'markdownTable.filter.text.endsWith': '结尾是',
'markdownTable.filter.number.gt': '大于',
'markdownTable.filter.number.gte': '大于等于',
'markdownTable.filter.number.lt': '小于',
'markdownTable.filter.number.lte': '小于等于',
'markdownTable.filter.number.between': '区间',
'mermaid.rendering': '正在渲染图表...',
'mermaid.viewCode': '</>',
'mermaid.viewDiagram': '⊞',
'mermaid.zoomIn': '+',
'mermaid.zoomOut': '−',
'mermaid.zoomReset': '↺',
'contextUsage.active': '已激活',
'contextUsage.autocompactBuffer': '自动压缩缓冲区',
'contextUsage.bodyLoaded': '已加载正文',
'contextUsage.builtinTools': '内置工具',
'contextUsage.contextWindow': '上下文窗口',
'contextUsage.detailHint': '运行 /context detail 查看逐项明细。',
'contextUsage.estimatedOverhead': '基础开销估算',
'contextUsage.estimatedUsage': '估算用量(含对话)',
'contextUsage.usageEstimatedWithConversation':
'尚未收到 provider 用量。下方估算包含对话。',
'contextUsage.estimatedUntilProviderUsage':
'Token 使用量为估算值,直到收到服务商返回的使用量。',
'contextUsage.free': '空闲',
'contextUsage.memoryFiles': 'Memory 文件',
'contextUsage.messages': '消息',
'contextUsage.startupContext': '启动上下文',
'contextUsage.unattributed': '未归因',
'contextUsage.cachedPrefix': '缓存前缀',
'contextUsage.mcpTools': 'MCP 工具',
'contextUsage.model': '模型',
'contextUsage.noSession':
'当前还没有会话。请先发送第一条消息,再查看上下文使用情况。',
'contextUsage.usageUnavailable':
'当前上下文用量暂不可用。下方仅为基础开销估算,不含对话消息。',
'contextUsage.overLimit':
'上下文已超过限制!请使用 /compress 或 /clear 减少占用。',
'contextUsage.skills': 'Skills',
'contextUsage.systemPrompt': '系统提示词',
'contextUsage.title': '上下文使用情况',
'contextUsage.tokens': 'tokens',
'contextUsage.used': '已用',
'contextUsage.accessibleUsage': (v) => `已用 ${v?.used} / ${v?.total} tokens`,
'contextUsage.viewDetails': '查看明细',
'contextUsage.viewInConversation': '点击在对话中查看上下文组成。',
'daemon.title': 'Daemon 状态',
'daemon.connection.title': '远程连接',
'daemon.connection.target': '当前目标',
'daemon.connection.state': '连接状态',
'daemon.connection.address': 'Daemon 地址',
'daemon.connection.token': 'Bearer token(可选)',
'daemon.connection.connect': '连接',
'daemon.connection.add': '添加连接',
'daemon.connection.saved': '已连接的计算机',
'daemon.connection.forget': (v) => `移除 ${v?.address}`,
'workspaceHost.local': '本地',
'workspaceHost.remote': '远程',
'workspaceHost.openHost': (v) => `打开 ${v?.host ?? ''}`,
'workspaceHost.statusOffline': '离线',
'workspaceHost.statusUnauthorized': '未授权',
'workspaceHost.focused': '已连接',
'workspaceHost.focusedHint': '本页面正连到这台 daemon,会话在这里运行。',
'workspaceHost.offlineHint':
'无法连接这台主机,当前显示的是最近一次已知的项目。',
'workspaceHost.unauthorizedHint':
'此主机保存的凭据已被拒绝,请打开该主机重新登录。',
'daemon.connection.invalid': '请输入有效的 HTTP 或 HTTPS origin。',
'daemon.connection.notReady': 'Daemon 未接受该连接,已保存的凭据未被修改。',
'daemon.connection.authFailed':
'Daemon 拒绝了该 token,已保存的凭据未被修改。',
'daemon.connection.reloadUnavailable':
'浏览器存储不可用,因此新 token 无法应用到当前连接。',
'daemon.connection.switchUnavailable':
'浏览器存储不可用,因此无法把 token 带到该 daemon。',
'daemon.connection.status.idle': '空闲',
'daemon.connection.status.connecting': '连接中',
'daemon.connection.status.adding': '添加中',
'daemon.connection.status.connected': '已连接',
'daemon.connection.status.error': '错误',
'daemon.details.loading': '正在加载诊断信息...',
'daemon.details.failed': '诊断信息加载失败。',
'daemon.refresh': '刷新',
'daemon.loading': '正在加载 Daemon 状态...',
'daemon.loadFailed': '加载 Daemon 状态失败',
'daemon.updatedAt': (v) => `更新于 ${v?.time ?? ''}`,
'daemon.none': '无',
'daemon.level.ok': '正常',
'daemon.level.warning': '警告',
'daemon.level.error': '错误',
'daemon.level.unavailable': '不可用',
'daemon.issues.title': '问题',
'daemon.overview.title': 'Daemon',
'daemon.overview.version': '版本',
'daemon.overview.pid': 'PID',
'daemon.overview.mode': '模式',
'daemon.overview.uptime': '运行时长',
'daemon.overview.workspace': '工作区',
'daemon.runtime.title': '运行时',
'daemon.runtime.activeSessions': '活跃会话',
'daemon.runtime.activePrompts': '执行中的 prompt',
'daemon.runtime.idle': '空闲时长',
'daemon.runtime.noActivity': '暂无活动',
'daemon.runtime.pendingPermissions': '待审批权限',
'daemon.runtime.permissionPolicy': '权限策略',
'daemon.runtime.channel': 'ACP 通道',
'daemon.runtime.channelLive': '在线',
'daemon.runtime.channelDown': '离线',
'daemon.runtime.startingUp': '运行时启动中...',
'daemon.runtime.startFailed': '运行时启动失败',
'daemon.runtime.channelWorker': '通道 Worker',
'daemon.runtime.channelWorkerRestarts': 'Worker 重启次数',
'daemon.runtime.memory': '内存 (RSS / 堆)',
'daemon.transport.title': '传输',
'daemon.transport.restSse': 'REST SSE 流',
'daemon.transport.acpDisabled': 'ACP 传输未启用',
'daemon.transport.acpConnections': 'ACP 连接',
'daemon.transport.acpStreams': 'ACP 流 (会话/SSE/WS)',
'daemon.transport.pendingRequests': '待处理客户端请求',
'daemon.transport.rateLimitRejected': '限流拒绝数',
'daemon.security.title': '安全',
'daemon.security.token': 'Bearer 令牌',
'daemon.security.requireAuth': '强制鉴权',
'daemon.security.loopback': '回环绑定',
'daemon.security.allowOrigin': '允许来源',
'daemon.security.shell': '会话 Shell 命令',
'daemon.security.configured': '已配置',
'daemon.security.notConfigured': '未配置',
'daemon.limits.title': '限制',
'daemon.limits.unlimited': '无限制',
'daemon.limits.maxSessions': '最大会话数',
'daemon.limits.maxPendingPrompts': '每会话最大待处理 prompt 数',
'daemon.limits.maxConnections': '最大监听连接数',
'daemon.limits.eventRing': '事件环大小',
'daemon.limits.promptDeadline': 'Prompt 截止时间',
'daemon.limits.sessionIdle': '会话空闲超时',
'daemon.capabilities.title': '能力',
'daemon.capabilities.titleCount': (v) => `能力 (${v?.count ?? 0})`,
'daemon.full.sessions.title': '会话',
'daemon.full.sessions.empty': '无活跃会话',
'daemon.full.session.pendingPrompts': (v) =>
`${v?.count ?? 0} 个待处理 prompt`,
'daemon.full.session.pendingPermissions': (v) =>
`${v?.count ?? 0} 个待审批权限`,
'daemon.full.session.prompting': '执行中',
'daemon.full.workspace.title': '工作区诊断',
'daemon.full.workspace.empty': '未上报工作区诊断',
'daemon.full.auth.title': '认证',
'daemon.full.auth.providers': '设备码登录提供方',
'daemon.full.auth.pending': '进行中的设备码登录',
'daemon.full.acp.title': 'ACP 连接',
'daemon.tab.overview': '概览',
'daemon.tab.usage': '用量',
'daemon.tab.metrics': '指标',
'daemon.tab.diagnostics': '诊断',
'daemon.charts.title': '指标图表',
'daemon.charts.empty': '正在采集指标…首次采样后显示图表。',
'daemon.charts.concurrency': '并发',
'daemon.charts.activePrompts': '执行中任务',
'daemon.charts.activeSessions': '会话',
'daemon.charts.requests': '请求数',
'daemon.charts.reqTotal': '总数',
'daemon.charts.reqErrors': '错误',
'daemon.charts.apiLatency': 'API 耗时',
'daemon.charts.promptLatency': 'Prompt 延迟',
'daemon.charts.queueWait': '排队等待',
'daemon.charts.promptDuration': '端到端',
'daemon.charts.eventLoop': '事件循环延迟',
'daemon.charts.eventLoopLag': '延迟 p99',
'daemon.charts.queuedPrompts': '排队中',
'daemon.charts.reqRejected': '限流拒绝',
'daemon.charts.llmLatency': 'LLM 耗时',
'daemon.charts.apiHealth': '模型 API 健康',
'daemon.charts.apiErrors': 'API 报错',
'daemon.charts.apiRetries': '重试',
'daemon.charts.cpu': 'CPU',
'daemon.charts.pipe': 'IPC 管道',
'daemon.charts.pipeIn': '接收',
'daemon.charts.pipeOut': '发送',
'daemon.charts.connections': '连接数',
'daemon.charts.cpuDaemon': 'Daemon',
'daemon.charts.cpuChild': '子进程',
'daemon.charts.rssDaemon': 'Daemon RSS',
'daemon.charts.rssChild': '子进程 RSS',
'daemon.charts.memory': '内存',
'daemon.charts.heap': '堆',
'daemon.charts.tokens': 'Token 消耗',
'daemon.charts.tokensIn': '输入',
'daemon.charts.tokensOut': '输出',
'daemon.charts.peak': '峰值',
'daemon.charts.concurrency.help':
'每次采样的实时负载:正在执行的 prompt、排队中(已接受未派发)、活跃会话数。排队数超过执行数即出现背压。',
'daemon.charts.requests.help':
'每个窗口内客户端↔守护进程的 HTTP 流量,并非模型调用。总请求数、返回 4xx/5xx 的数量、被限流拒绝的数量。',
'daemon.charts.apiLatency.help':
'客户端↔守护进程 HTTP 请求耗时(p50/p95)——反映守护进程本身快慢,而非模型。与「LLM 耗时」对比可区分是"我们慢"还是"模型慢"。',
'daemon.charts.llmLatency.help':
'每轮模型 API 往返耗时(守护进程→模型→守护进程),p50/p95。属模型侧延迟,区别于上面的 HTTP「API 耗时」。',
'daemon.charts.apiHealth.help':
'服务商侧 LLM 失败。每次失败尝试 = 1 次报错,每次自动退避 = 1 次重试。瞬时 429/5xx 通常被重试吸收(报错 ≈ 重试);报错高于重试说明调用彻底失败。',
'daemon.charts.promptLatency.help':
'每个 prompt(任务):派发前在会话队列中的等待 p95,以及端到端执行 p95。等待升高即背压信号。',
'daemon.charts.eventLoop.help':
'守护进程事件循环延迟 p99——CPU 饱和 / 阻塞信号。延迟高说明守护进程被拖住,一切都会变慢。',
'daemon.charts.cpu.help':
'每次采样的 CPU 占用(占全部核心百分比):守护进程,以及运行实际 LLM/工具的 ACP 子进程。子进程 0% 表示无子进程运行。',
'daemon.charts.memory.help':
'每次采样的常驻内存:守护进程 RSS、守护进程 V8 堆、ACP 子进程 RSS。若持续增长可能是内存泄漏。',
'daemon.charts.pipe.help':
'每个窗口内经 stdio 管道与 ACP 子进程收发的字节数。持续偏大说明守护进程与子进程间帧交互频繁。',
'daemon.charts.connections.help':
'每次采样的客户端传输连接:REST/SSE 流、ACP WebSocket 流、ACP 连接数。',
'daemon.charts.tokens.help':
'每个窗口内计入模型轮次的输入(prompt)与输出(completion)token——随时间的模型消耗。',
'daemon.usage.today': '今日',
'daemon.usage.period7d': '7天',
'daemon.usage.period30d': '30天',
'daemon.usage.rangeWeek': '近 7 天',
'daemon.usage.rangeMonth': '近 30 天',
'daemon.usage.rangeGroup': '统计周期',
'daemon.usage.tokensConsumed': 'tokens 消耗',
'daemon.usage.sessions': '会话',
'daemon.usage.requests': '请求',
'daemon.usage.tools': '工具',
'daemon.usage.changes': '改动',
'daemon.usage.breakdownTitle': 'Token 拆分',
'daemon.usage.inputTokens': '输入 tokens',
'daemon.usage.inputHint': '请求 + 缓存读取',
'daemon.usage.outputTokens': '输出 tokens',
'daemon.usage.outputHint': '响应 + 推理',
'daemon.usage.cacheRead': '缓存读取',
'daemon.usage.cacheHint': '缓存读取占比',
'daemon.usage.heatmapTitle': 'Token 热力图',
'daemon.usage.heatmapSub': (v) =>
`最近 ${v?.months ?? 12} 个月 · 每日 token 汇总`,
'daemon.usage.low': '少',
'daemon.usage.high': '多',
'daemon.usage.dowMon': '一',
'daemon.usage.dowWed': '三',
'daemon.usage.dowFri': '五',
'daemon.usage.empty': '暂无 token 使用记录。',
'daemon.usage.loading': '加载用量中…',
'daemon.usage.failed': '加载用量失败',
'daemon.usage.cellTokens': (v) =>
`${v?.date ?? ''} · Tokens: ${v?.tokens ?? '0'} · Cache: ${v?.cache ?? 0}%`,
'daemon.usage.rangeWordToday': '今日',
'daemon.usage.rangeWordWeek': '7 天',
'daemon.usage.rangeWordMonth': '30 天',
'daemon.usage.modelShareTitle': '模型份额',
'daemon.usage.modelShareSub': 'token 份额 · 浅绿表示缓存读取',
'daemon.usage.modelMeta': (v) =>
`${v?.tokens ?? '0'} tokens · 缓存 ${v?.cache ?? 0}%`,
'daemon.usage.skillTitle': '技能调用',
'daemon.usage.skillSub': '技能名 / 次数',
'daemon.usage.skillName': '技能名',
'daemon.usage.skillCount': '次数',
'daemon.usage.dailyTokensTitle': 'Tokens',
'daemon.usage.dailyTokensSub': '每日 token 总量',
'daemon.usage.dailySessionsTitle': '会话',
'daemon.usage.dailySessionsSub': '每日活跃会话数',
'delete.cannotCurrent': '当前会话正在运行,无法删除。',
'delete.action': '删除',
'delete.deleted': '会话已删除。',
'delete.deletedCount': (v) => `已删除 ${v?.count ?? 0} 个会话。`,
'delete.deleting': '删除中...',
'delete.failed': (v) => `删除会话失败。${v?.reason ? ` ${v.reason}` : ''}`,
'delete.footer': '↑↓ 导航 · Space 选择 · Enter 删除 · Esc 取消',
'delete.noMatch': (v) => `没有匹配 "${v?.query ?? ''}" 的会话`,
'delete.none': '没有可删除的会话',
'delete.allFailed': (v) =>
`删除 ${v?.count ?? 0} 个会话失败: ${v?.reason ?? '未知错误'}`,
'delete.nonRemoved': '没有会话被删除。',
'delete.notFound': '会话未找到,可能已被删除。',
'delete.partialFail': (v) =>
`已删除 ${v?.removed ?? 0} 个,${v?.failed ?? 0} 个失败: ${v?.detail ?? '未知错误'}`,
'delete.matches': (v) => `${v?.count ?? 0} 个匹配`,
'delete.pressSearch': '按 / 搜索;Space 选择;Enter 删除',
'delete.selected': (v) => `已选 ${v?.count ?? 0} 个`,
'delete.title': '删除会话',
'time.justNow': '刚刚',
'time.minutesAgo': (v) => `${v?.count ?? 0} 分钟前`,
'time.hoursAgo': (v) => `${v?.count ?? 0} 小时前`,
'time.daysAgo': (v) => `${v?.count ?? 0} 天前`,
'dialog.footer.close': 'Esc 关闭',
'dialog.footer.confirmCancel': 'Enter 确认 · Esc 取消',
'release.cannotCurrent': '不能释放当前活动会话。',
'release.action': '释放',
'release.released': '会话已释放。',
'release.failed': (v) => `释放会话失败。${v?.reason ? ` ${v.reason}` : ''}`,
'release.footer': '↑↓ 导航 · Enter 释放 · Esc 取消',
'release.inactive': '只有活跃的 live session 才能释放。',
'release.inactiveBadge': '非活跃',
'release.noMatch': (v) => `没有匹配 "${v?.query ?? ''}" 的会话`,
'release.matches': (v) => `${v?.count ?? 0} 个匹配`,
'release.none': '没有可释放的 live session',
'release.pressSearch': '按 / 搜索;Enter 释放选中的 live session',
'release.releasing': '释放中...',
'release.title': '释放会话',
'dialog.footer.menu': 'Esc 返回菜单',
'dialog.footer.mcpServers': '↑↓ 导航 · Enter 查看详情 · r 刷新 · Esc 关闭',
'dialog.footer.mcpSelect': '↑↓ 导航 · Enter 选择 · Esc 返回',
'dialog.footer.modelFast':
'↑↓ 导航 · / 搜索 · c 自定义 · Enter 设置 fast model · Esc 取消',
'dialog.footer.navSelectCancel': '↑↓ 导航 · Enter 选择 · Esc 取消',
'dialog.footer.navSelectClose': '↑↓ 导航 · Enter 选择 · Esc 关闭',
'dialog.footer.navSelectMenu': '↑↓ 导航 · Enter 选择 · Esc 返回菜单',
'dialog.footer.navOpenClose': '↑↓ 导航 · Enter 打开 · Esc 关闭',
'dialog.footer.navOpenMenu': '↑↓ 导航 · Enter 打开 · Esc 返回菜单',
'dialog.footer.back': 'Esc 返回',
'dialog.footer.backClose': 'Esc 关闭',
'dialog.footer.saveClose': '↑↓ 切换输入框 · ⌘/Ctrl+Enter 保存 · Esc 关闭',
'dialog.footer.saveMenu': '↑↓ 切换输入框 · ⌘/Ctrl+Enter 保存 · Esc 返回菜单',
'dialog.footer.search': '输入搜索 · Enter 确认 · Esc 清空',
'dialog.footer.select': 'Enter 选择',
'editor.escClearHint': '再按一次 Esc 清空',
'editor.hintCommands': '命令',
'editor.hintFiles': '文件',
'editor.hintNext': '下一条',
'editor.hintPrev': '上一条',
'editor.hintSearch': '搜索',
'editor.noHistory': '没有匹配的历史记录',
'editor.placeholder': '输入消息或 @ 文件路径',
'history.loadingEarlier': '正在加载更早消息…',
'history.openEarlier': '打开更早历史',
'history.loadEarlier': '加载更早记录',
'history.loadNewer': '加载较新记录',
'history.returnLatest': '返回最新',
'history.viewUnavailable': '会话正在重连或修复记录,历史暂时不可用。',
'history.snapshotView': '历史快照 · 只读',
'history.viewError':
'暂时无法加载此段记录。请移动阅读位置后重试,或返回最新。',
'history.capacityReached': '已达到历史显示上限,更早消息仍保存在会话中。',
'history.paginationError': '无法加载更早的历史记录。',
'history.retry': '重试',
'editor.shellPlaceholder': '请输入终端命令',
'editor.send': '发送消息',
'editor.imagesSkipped': (v) => `已跳过 ${v?.count ?? 0} 个不可读取的文件。`,
'editor.imagesReadFailed': (v) => `${v?.count ?? 0} 个文件读取失败。`,
'editor.imagesTooLarge': (v) => `${v?.count ?? 0} 个文件超过附件大小限制。`,
'editor.pastedTextShowInEditor': '显示到输入框',
'editor.connectionDisconnected': '连接已中断,请在恢复后重试。',
'editor.sessionLoading': '会话正在加载,请稍后再发送。',
'editor.processing': '处理中。新消息会进入队列。',
'editor.searchHint': 'ctrl+r 下一条 · tab 采纳 · enter 发送 · esc 取消',
'editor.searchLabel': '历史搜索:',
'editor.searchPlaceholder': '输入以搜索…',
'editor.newSessionSuggestionTitle': '这条消息看起来像新话题',
'editor.newSessionSuggestionStart': '在新会话发送',
'editor.btwSuggestionTitle': '这条消息看起来像顺带一问',
'editor.btwSuggestionSend': '用 BTW 提问',
'quickActions.extensions': '扩展',
'quickActions.help': '帮助',
'quickActions.auth': '认证',
'quickActions.settings': '设置',
'quickActions.copy': '复制输出',
'quickActions.shellMode': 'Shell模式',
'quickActions.exitShellMode': '退出Shell',
'session.missing': '当前会话不存在',
'session.new': '新建会话',
'workspace.loadFailed': '工作区加载失败',
'workspace.notFound': '工作区不存在',
'workspace.notFoundDescription': '此工作区可能已被移除,或链接已经失效。',
'workspace.loadFailedDescription':
'无法连接工作区服务,请检查守护进程后重试。',
// 定时任务页面
'scheduledTasks.title': '定时任务',
'scheduledTasks.subtitle': '按计划自动执行任务,也可随时手动触发。',
'scheduledTasks.loading': '加载中…',
'scheduledTasks.count': (v) => `${v?.count ?? 0} 个任务`,
'scheduledTasks.refresh': '刷新',
'scheduledTasks.new': '新建定时任务',
'scheduledTasks.createViaChat': '通过聊天创建',
'scheduledTasks.chatStarter': '帮我创建一个长期保留的定时任务,我想:',
'scheduledTasks.name': '名称',
'scheduledTasks.workspace': '工作区',
'scheduledTasks.session.label': '会话',
'scheduledTasks.session.dedicated': '独立任务会话',
'scheduledTasks.session.current': '当前会话',
'scheduledTasks.session.dedicatedHint':
'任务运行记录保存在单独创建的会话中。',
'scheduledTasks.session.currentHint': '后续运行继续在当前打开的会话中。',
'scheduledTasks.session.currentUnsupported':
'当前 daemon 不支持绑定当前会话。',
'scheduledTasks.session.currentUnavailable': '请先打开一个已有会话。',
'scheduledTasks.session.currentBusy': '请等待当前执行或待处理交互结束。',
'scheduledTasks.session.currentIneligible': '此类会话不能绑定定时任务。',
'scheduledTasks.session.currentWorkspaceMismatch':
'当前会话属于另一个工作区。',
'scheduledTasks.session.currentAlreadyBound': '当前会话已绑定其他定时任务。',
'scheduledTasks.taskId': '任务 ID',
'scheduledTasks.schedule': '计划',
'scheduledTasks.type': '类型',
'scheduledTasks.status': '状态',
'scheduledTasks.namePlaceholder': '可选 —— 默认取提示词',
'scheduledTasks.prompt': '提示词',
'scheduledTasks.promptPlaceholder': '这个任务要做什么?',
'workflowRuns.title': '工作流',
'workflowRuns.saved': '已保存',
'workflowRuns.active': '运行中',
'workflowRuns.history': '历史',
'workflowRuns.create': '新建',
'workflowRuns.refresh': '刷新',
'workflowRuns.loading': '正在加载工作流…',
'workflowRuns.loadFailed': '工作流加载失败。',
'workflowRuns.noSession': '请先打开本项目中的任一会话,再查看工作流记录。',
'workflowRuns.emptyActive': '当前没有运行中的工作流。',
'workflowRuns.emptyHistory': '暂时没有已保存的工作流记录。',
'workflowRuns.emptySaved': '还没有可复用的工作流。',
'workflowRuns.emptySavedHint':
'可以点击“新建”让 Qwen Code 创建、在终端中保存一次已完成的运行,或在 .qwen/workflows 下添加 .js 文件。',
'workflowRuns.project': '项目',
'workflowRuns.user': '用户',
'workflowRuns.projectDescription': '仅在当前项目中可用',
'workflowRuns.userDescription': '在所有项目中可用',
'workflowRuns.extension': '扩展',
'workflowRuns.extensionDescription': '由已安装的扩展提供',
'workflowRuns.detail.toggle': (v) => `查看 ${v?.name ?? ''} 的详情`,
'workflowRuns.detail.loading': '正在加载工作流定义…',
'workflowRuns.detail.unavailable': '这个工作流定义已不可用。',
'workflowRuns.detail.loadFailed': '无法读取工作流定义。',
'workflowRuns.detail.retry': '重试',
'workflowRuns.detail.noDescription': '这个工作流没有声明描述。',
'workflowRuns.detail.whenToUse': '适用场景',
'workflowRuns.detail.metaError': (v) => `meta 块无法解析:${v?.error ?? ''}`,
'workflowRuns.detail.phases': (v) => `阶段(${v?.count ?? 0})`,
'workflowRuns.detail.recentRuns': '最近运行',
'workflowRuns.detail.noRuns': '当前会话还没有运行记录。',
'workflowRuns.detail.viewRuns': (v) => `在历史中查看 ${v?.count ?? 0} 次运行`,
'workflowRuns.detail.showSource': '查看源码',
'workflowRuns.detail.hideSource': '收起源码',
'workflowRuns.run': '运行',
'workflowRuns.starting': '正在启动…',
'workflowRuns.runNamed': (v) => `运行 ${v?.name ?? ''}`,
'workflowRuns.startFailed': '工作流未能启动,请刷新后重试。',
'scheduledTasks.reference.extension': '扩展',
'scheduledTasks.reference.skill': '技能',
'scheduledTasks.reference.mcp': 'MCP',
'scheduledTasks.referencePicker': '引用选择器',
'scheduledTasks.reference.remove': '删除',
'scheduledTasks.reference.loading': '加载中…',
'scheduledTasks.reference.empty': '暂无可选项。',
'scheduledTasks.frequency': '频率',
'scheduledTasks.freq.daily': '每天',
'scheduledTasks.freq.weekdays': '工作日',
'scheduledTasks.freq.weekly': '每周',
'scheduledTasks.freq.hourly': '每小时',
'scheduledTasks.freq.minutes': '每 N 分钟',
'scheduledTasks.freq.custom': '自定义(cron)',
'scheduledTasks.time': '时间',
'scheduledTasks.weekday': '星期',
'scheduledTasks.interval': '分钟',
'scheduledTasks.cron': 'Cron 表达式',
'scheduledTasks.weekdayNames': '周日,周一,周二,周三,周四,周五,周六',
'scheduledTasks.human.daily': (v) => `每天 ${v?.time ?? ''}`,
'scheduledTasks.human.weekdays': (v) => `工作日 ${v?.time ?? ''}`,
'scheduledTasks.human.weekly': (v) => `每${v?.day ?? ''} ${v?.time ?? ''}`,
'scheduledTasks.human.hourly': (v) => `每小时 第 ${v?.min ?? '00'} 分`,
'scheduledTasks.human.everyMinutes': (v) => `每 ${v?.n ?? ''} 分钟`,
'scheduledTasks.never': '尚未运行',
'scheduledTasks.repeats': '重复',
'scheduledTasks.runsOnce': '仅一次',
'scheduledTasks.lastFired': (v) => `上次运行:${v?.when ?? ''}`,
'scheduledTasks.runNow': '立即运行',
'scheduledTasks.enable': '启用',
'scheduledTasks.disable': '停用',
'scheduledTasks.delete': '删除',
'scheduledTasks.deleteConfirmTitle': '删除定时任务',
'scheduledTasks.deleteConfirm': (v) =>
`确定删除定时任务「${v?.name ?? ''}」?`,
'scheduledTasks.deletedSnapshot':
'这个定时任务已被删除,下面显示的是创建时的快照。',
'scheduledTasks.sessionScopedSnapshot':
'这是一个会话内定时任务,下面显示的是创建时的快照。',
'scheduledTasks.empty': '还没有定时任务,创建一个开始吧。',
'scheduledTasks.create': '创建',
'scheduledTasks.creating': '创建中…',
'scheduledTasks.cancel': '取消',
'scheduledTasks.error.invalidSchedule': '计划无效',
'scheduledTasks.error.workspaceUnavailable': '所选工作区不可用或不受信任',
'scheduledTasks.error.emptyPrompt': '提示词不能为空',
'scheduledTasks.error.promptTooLong': (v) =>
`提示词超过 ${v?.max ?? 100_000} 字符限制`,
'scheduledTasks.error.goalActive': '目标运行期间无法启动定时任务。',
'scheduledTasks.error.toggleFailed': '更新任务失败',
'scheduledTasks.error.deleteFailed': '删除任务失败',
'scheduledTasks.edit': '编辑',
'scheduledTasks.editTitle': '编辑定时任务',
'scheduledTasks.save': '保存',
'scheduledTasks.saving': '保存中…',
'scheduledTasks.runHistory': (v) => `运行记录(${v?.count ?? 0})`,
'scheduledTasks.viewHistory': (v) => `查看对话(${v?.count ?? 0})`,
'scheduledTasks.viewHistoryEmpty': '查看对话',
'scheduledTasks.viewHistoryHint': '打开该任务的会话查看运行详情',
'scheduledTasks.runKind.catchUp': '补跑',
'scheduledTasks.runKind.manual': '手动',
'scheduledTasks.runKind.withheld': '已跳过',
'scheduledTasks.runKind.sessionDispatchFailed': '新建会话失败,未运行',
'scheduledTasks.runKind.sessionDispatchFallback':
'新建会话失败,已在任务会话中运行',
'scheduledTasks.openRunSession': '打开本次运行会话',
'scheduledTasks.runContext.title': '定时任务运行',
'scheduledTasks.runContext.taskId': '任务 ID',
'scheduledTasks.runContext.schedule': '计划',
'scheduledTasks.runContext.triggeredAt': '触发于',
'scheduledTasks.runContext.trigger.scheduled': '定时触发',
'scheduledTasks.runContext.trigger.manual': '手动运行',
'scheduledTasks.error.runFailed': '记录运行失败',
'scheduledTasks.error.oneShotConsumedButFailed':
'任务已删除,但提示词未能送达——它没有运行。请重新创建后重试。',
'scheduledTasks.dueNow': '即将运行',
'scheduledTasks.nextRunTooltip': (v) => `下次运行:${v?.when ?? ''}`,
'scheduledTasks.dur.d': '天',
'scheduledTasks.dur.h': '小时',
'scheduledTasks.dur.m': '分',
'scheduledTasks.dur.s': '秒',
'scheduledTasks.runIn': '运行于',
'scheduledTasks.sessionMode.perRun': '每次新会话',
'scheduledTasks.sessionMode.persistent': '固定会话',
'scheduledTasks.sessionMode.perRun.hint':
'每次运行都创建独立会话,使用干净的上下文。',
'scheduledTasks.sessionMode.persistent.hint':
'所有运行都继续使用同一个任务会话。',
'scheduledTasks.model': '模型',
'scheduledTasks.model.workspaceDefault': '工作区默认模型',
'scheduledTasks.model.hint': '创建每次运行的新会话时应用所选模型。',
'scheduledTasks.group': '会话分组',
'scheduledTasks.group.none': '不分组',
'scheduledTasks.group.create': '新建分组…',
'scheduledTasks.group.name': '新分组名称',
'scheduledTasks.group.color': '分组颜色',
'scheduledTasks.group.hint': '每次运行产生的会话都会放入这个分组。',
'scheduledTasks.group.nameRequired': '请输入新分组名称。',
'scheduledTasks.routing.loading': '正在加载模型和分组…',
'scheduledTasks.condition': '前置条件(可选)',
'scheduledTasks.conditionPlaceholder':
'例如:检查昨天以来 main 分支有没有新提交。如果没有,则本次不应执行。',
'scheduledTasks.condition.hint':
'每次触发前,先在本任务自己的会话中检查该条件。只有判定为"是",才会新建会话执行命令;否则跳过本次运行。',
'scheduledTasks.condition.cardPrefix': '若:',
'turnOutputs.filesEdited': (v) => `已编辑 ${v?.count ?? 0} 个文件`,
'turnOutputs.imagePreview': '图片预览',
'turnOutputs.viewChanges': '查看更改',
// 与英文键同理:键名保留历史 `review`,标签改为“文件更改”,
// 代码审查结果视图使用 `codeReview.*`,请勿“修正”此不一致。
'turnOutputs.review': '文件更改',
'turnOutputs.reviewLatest': '查看最近文件修改',
'codeReview.authoritativeVerdict': '权威裁决',
'codeReview.targetEffort': (v) =>
`目标:${v?.target ?? ''} · 强度:${v?.effort ?? ''}`,
'codeReview.openReport': '打开 Markdown 报告',
'codeReview.loadingReport': '正在加载 Markdown 报告…',
'codeReview.back': '返回审查结果',
'codeReview.reviewCounts': '审查计数',
'codeReview.total': '总计',
'codeReview.confidence': (v) => `${v?.value ?? ''} 置信度`,
'codeReview.held': '暂缓',
'codeReview.heldByMeasurement': '经基线测量暂缓,未保留 Critical',
'codeReview.caps': '裁决上限',
'codeReview.none': '无',
'codeReview.severity': '严重级别',
'codeReview.confidenceLabel': '置信度',
'codeReview.all': '全部',
'codeReview.noMatches': '没有符合当前筛选条件的发现。',
'codeReview.source': (v) => `来源:${v?.value ?? ''}`,
'codeReview.failureScenario': '失败场景',
'codeReview.witness': '实测证据',
'codeReview.suggestedFix': '建议修复',
'codeReview.outcome': '处理结果',
'codeReview.locations': '位置',
'codeReview.evidence': '证据',
'codeReview.notLinked': '未链接',
'codeReview.loadErrorTitle': '无法显示代码审查结果',
'codeReview.loading': '正在加载代码审查结果…',
'codeReview.artifactTruncated': '代码审查制品已截断,无法验证。',
'codeReview.reportTruncated': 'Markdown 报告已截断。',
'codeReview.unavailable': (v) =>
`此代码审查已不再具备权威性,制品状态为 ${v?.status ?? 'unknown'}。请重新生成审查结果。`,
'codeReview.workspaceRequired': '代码审查制品必须是可读取的工作区文件。',
'sideTask.title': '侧边任务',
'sideTask.description': '查看或新增侧边任务',
'sideTask.new': '新增',
'sideTask.create': '新建侧边任务',
'webPreview.title': '网页预览',
'webPreview.openHint': '预览正在运行的网页应用',
'webPreview.address': '开发地址',
'webPreview.open': '打开',
'webPreview.refresh': '刷新预览',
'webPreview.desktop': '桌面宽度',
'webPreview.mobile': '手机宽度(390 px)',
'webPreview.external': '外部打开',
'webPreview.frame': '网页预览容器',
'webPreview.saved': '当时保存的版本',
'webPreview.savedFrame': '历史网页版本',
'webPreview.savedUnavailable': '这份历史版本已丢失或被修改,无法打开。',
'webPreview.savedLoadFailed': '暂时无法加载这份历史版本,请重试。',
'webPreview.page': '应用预览',
'webPreview.empty': '启动开发服务器,然后在上方输入地址。',
'webPreview.reachable':
'使用当前浏览器可访问的地址。远程服务器请使用可访问的 URL 或已有的端口转发。',
'webPreview.fallback':
'页面空白?请检查服务器或外部打开。地址栏和刷新使用最初打开的地址。',
'webPreview.live':
'实时页面:从历史消息打开链接,也会显示当前内容,不是当时保存的版本。',
'webPreview.invalidUrl':
'请使用独立开发服务器的 HTTP/HTTPS 地址,主机名或 IPv4 均可,且不含登录凭据。不能预览 Web Shell 或 daemon 地址。',
'terminal.title': '终端',
'terminal.open': '打开终端',
'terminal.notice.exited': (v) => `进程已退出,退出码 ${v?.exitCode ?? '?'}`,
'terminal.notice.error': (v) => `错误:${v?.message ?? ''}`,
'terminal.notice.unknownError': '未知错误',
'terminal.notice.reconnecting': '连接已断开,正在重连…',
'terminal.notice.protocolMismatch':
'终端协议已更新,请重启 daemon 并刷新页面。',
'localFiles.title': '本地文件',
'localFiles.trigger': '本地文件',
'localFiles.hint':
'让当前会话读写你本机的一个目录。文件留在你的电脑上,只有 agent 主动索取的内容会发给它。',
'localFiles.connect': '连接目录…',
'localFiles.reconnect': '重新连接',
'localFiles.disconnect': '断开',
'localFiles.openInNewTab': '在新标签页打开',
'localFiles.directory': '目录',
'localFiles.tools': (v) => `${v?.count ?? 0} 个工具`,
'localFiles.status.idle': '未连接',
'localFiles.status.connecting': '连接中…',
'localFiles.status.registering': '注册中…',
'localFiles.status.connected': '已连接',
'localFiles.status.reconnecting': '重连中…',
'localFiles.status.heldElsewhere': '已在其他标签页连接',
'localFiles.status.needsSession': '等待会话',
'localFiles.status.needsGesture': '需要重新连接',
'localFiles.status.failed': '连接失败',
'localFiles.status.unavailable': '当前环境不可用',
'localFiles.status.resolving': '解析中…',
'localFiles.needsSessionHint':
'请先创建一个会话。桥只绑定一个会话,因此其他会话无法访问你的文件。',
'localFiles.blocker.insecureContext':
'当前页面不是安全上下文,浏览器不会授予本地文件访问权。请通过 https 访问 Web Shell,或用 SSH 转发 daemon 端口后打开 http://localhost:<port>。',
'localFiles.blocker.crossOriginFrame':
'跨源 iframe 中本地文件访问被禁用。请在独立的浏览器标签页中打开 Web Shell 再连接目录。',
'localFiles.blocker.unsupportedBrowser':
'当前浏览器没有 File System Access API。请使用 Chrome 或 Edge 连接本地目录。',
'localFiles.blocker.workspaceIneligible':
'该会话的工作区不能托管本地目录(不受信任或 live 工作区)。',
'localFiles.blocker.workspaceResolving': '尚不能确定该会话所属的工作区。',
'localFiles.blocker.unsupportedDaemon':
'该 daemon 未启用客户端文件桥(client_mcp_over_ws)。以 QWEN_SERVE_CLIENT_MCP_OVER_WS=1 启动 daemon 即可启用本地文件。',
...FILES_MESSAGES_ZH,
'rightPanel.add': '添加页签',
'attachment.showPreview': '预览',
'attachment.showSource': '源码',
'attachment.previewUnsupported': '暂不支持预览此文件类型。',
'attachment.readFailed': '读取附件失败。',
'attachment.loadingFile': '正在加载文件...',
'attachment.loadingPreview': '正在加载预览...',
'sideTask.creating': '正在创建侧边任务…',
'sideTask.createFailed': '创建侧边任务失败',
'sideTask.commandsLoadingTimedOut':
'命令信息尚未就绪。侧任务提示词已保留,将在信息加载后重新检查。',
'sideTask.promptFailed': '发送侧边任务问题失败',
'sideTask.renameFailed': '侧边任务命名失败',
'turnOutputs.preview': '预览',
'turnOutputs.collapseFiles': '收起文件',
'turnOutputs.showMoreFiles': (v) => `再展示 ${v?.count ?? 0} 个文件`,
'turnOutputs.collapseArtifacts': '收起产物',
'turnOutputs.showMoreArtifacts': (v) => `再展示 ${v?.count ?? 0} 个产物`,
'turnOutputs.previousTurn': '上轮对话',
'turnOutputs.fileCount': (v) => `${v?.count ?? 0} 个文件`,
'turnOutputs.openFileTree': '打开文件树',
'turnOutputs.closeFileTree': '关闭文件树',
'turnOutputs.artifactMissing': '工作区中未找到该文件',
'turnOutputs.artifactUnavailable': (v) =>
v?.path ? `工作区中未找到该文件 · ${v.path}` : '工作区中未找到该文件',
'sidebar.label': '工作区侧边栏',
'sidebar.home': '首页',
'sidebar.channelSettings': '设置',
'sidebar.liveSettings': '设置',
'sidebar.liveSettingsUnavailable': '当前服务未提供 Live 设置。',
'sidebar.more': '更多',
'sidebar.navigation': '主导航',
'sidebar.toggleMenu': '切换菜单',
'sidebar.newChat': '新对话',
'sidebar.newTask': '新建任务',
'sidebar.newWorktreeTask': '新建 Worktree 任务',
'sidebar.plugins': '插件',
'sidebar.channels': '频道',
'sidebar.sessionSource': '会话来源',
'sidebar.sessionSource.tasks': '任务',
'sidebar.sessionSource.channels': '频道',
'sidebar.channelType.other': '其他频道',
'sidebar.live': 'Live',
'sidebar.liveVoicePending': 'Voice chat',
'sidebar.project': '项目',
'sidebar.pinnedSessions': '置顶',
'sidebar.workspaceSelectLabel': '工作区',
'sidebar.noWorkspace': '无工作区',
'sidebar.noWorkspaceSessions': '无工作区会话',
'sidebar.copySessionId': '复制会话 ID',
'sidebar.copySessionIdFailed': '复制会话 ID 失败',
'sidebar.sessionIdCopied': '会话 ID 已复制',
'sidebar.workspaceUntrusted': '未信任',
'sidebar.manageWorkspaces': '管理工作区…',
'sidebar.workspaceReadOnly': '只读',
'sidebar.workspaceTrustToOpen': '信任此工作区后才能打开会话。',
'sidebar.addWorkspace': '添加工作区',
'sidebar.newWorkspace': '新建工作区',
'sidebar.startFromScratch': '从空目录开始',
'sidebar.useExistingFolder': '使用已有目录…',
'sidebar.scratchOutcomeUnknownTitle': '确认工作区创建结果',
'sidebar.scratchOutcomeUnknown':
'守护进程响应已中断。再次创建前,请检查刷新后的工作区列表。',
'sidebar.scratchOutcomeRefresh': '刷新工作区列表',
'sidebar.scratchOutcomeAcknowledge': '我已检查工作区列表',
'sidebar.addWorkspaceTitle': '添加工作区',
'sidebar.addWorkspacePath': '目录路径',
'sidebar.addWorkspaceBrowse': '浏览…',
'sidebar.addWorkspaceBrowseError':
'无法打开系统文件夹选择器,请改为输入绝对路径。',
'sidebar.addWorkspaceDisplayName': '展示名称(可选)',
'sidebar.addWorkspaceDisplayNameHint':
'用于 Web Shell 展示;目录路径仍是工作区身份。',
'sidebar.addWorkspaceRegister': '注册',
'sidebar.addWorkspaceCancel': '取消',
'sidebar.addWorkspaceError': '添加工作区失败',
'sidebar.addWorkspaceBusyError': '另一个工作区操作正在进行中',
'sidebar.addWorkspacePersistenceError': '守护进程未确认工作区已持久化注册',
'sidebar.addWorkspaceRefreshError': '工作区已添加,但无法刷新工作区列表',
'sidebar.addWorkspaceAbsError': '请输入绝对路径或 SSH 工作区地址。',
'sidebar.addWorkspaceHint':
'请输入本地绝对路径或 ssh://user@host/absolute/project。SSH 需要密钥认证、已确认的主机密钥,以及远端 Python 3。Shell 命令还需要 Bash;远端无需安装 Qwen。',
'sidebar.addWorkspaceSuggestions': '目录建议',
'sidebar.addWorkspacePersist': '服务重启后保留',
'sidebar.addWorkspacePersistHint': '将此工作区注册持久化到守护进程配置中。',
'sidebar.addWorkspaceAdding': '添加中…',
'workspaceHost.source': '目录来源',
'workspaceHost.thisComputer': '这台计算机',
'workspaceHost.folderOn': (vars) => `${vars?.address} 上的目录`,
'workspaceHost.folderOnThisComputer': '这台计算机上的目录',
'workspaceHost.browseHint': '请从下方选择目录,或输入绝对路径。',
'workspaceHost.parent': '上一级',
'workspaceHost.addFolder': '添加此文件夹',
'workspaceHost.noFolders': '此目录下没有子目录。',
'workspaceHost.folderListError':
'无法读取该计算机上的目录,请检查路径或连接状态。',
'workspaceHost.navigationUnavailable':
'浏览器存储不可用,无法安全继续添加远程目录。',
'workspaceHost.unsupported': '这台计算机不支持添加工作区。',
'workspaceHost.loadingFolders': '正在从这台计算机加载目录…',
'workspaceHost.connectionError': '无法从这台计算机加载工作区能力。',
'sidebar.removeWorkspace': '移除工作区',
'sidebar.workspaceActions': '工作区操作',
'sidebar.renameWorkspace': '重命名…',
'sidebar.renameWorkspaceTitle': '重命名工作区',
'sidebar.workspaceNamePrompt': '显示名称',
'sidebar.workspaceNameHint': '留空则显示文件夹名。',
'sidebar.workspaceNameInvalid': '名称不能包含控制字符。',
'sidebar.renameWorkspaceFailed': '重命名工作区失败',
'sidebar.copyWorkspacePath': '复制路径',
'sidebar.copyWorkspacePathFailed': '复制工作区路径失败',
'sidebar.openWorkspaceFolder': '打开文件夹',
'sidebar.openWorkspaceFolderFailed': '打开工作区文件夹失败',
'sidebar.openWorkspaceFolderOpened': '已打开工作区文件夹',
'sidebar.openWorkspaceTerminal': '打开终端',
'sidebar.openWorkspaceTerminalFailed': '打开终端失败',
'sidebar.openWorkspaceTerminalOpened': '已在工作区打开终端',
'sidebar.manageWorkspace': '管理',
'sidebar.reloadWorkspace': '重新加载运行时',
'sidebar.reloadWorkspaceFailed': '重新加载工作区运行时失败',
'sidebar.workspaceCount': (v) => `${v?.count ?? 0} 个工作区`,
'sidebar.sessionsRunning': (v) => `${v?.count ?? 0} 个会话运行中`,
'sidebar.sessionsAttention': (v) => `${v?.count ?? 0} 个会话等待处理`,
'sidebar.sessionsTotal': (v) =>
`${v?.count ?? 0}${v?.truncated ? '+' : ''} 个会话`,
'sidebar.overview.sessions': '会话',
'sidebar.overview.mcp': 'MCP',
'sidebar.overview.skills': '技能',
'sidebar.overview.extensions': '扩展',
'sidebar.overview.channels': '频道',
'sidebar.overview.context': '上下文',
'sidebar.overview.hooks': 'Hooks',
'sidebar.overview.settings': '设置',
'sidebar.overview.mcpDetail': (v) =>
`${v?.configured ?? 0} 个已配置,${v?.connected ?? 0} 个已连接` +
(Number(v?.failed) > 0 ? `,${v?.failed} 个失败` : '') +
(Number(v?.disabled) > 0 ? `,${v?.disabled} 个已禁用` : ''),
'sidebar.overview.skillsDetail': (v) =>
`共 ${v?.total ?? 0} 个,${v?.enabled ?? 0} 个已启用`,
'sidebar.overview.extensionsDetail': (v) =>
`共 ${v?.total ?? 0} 个,${v?.active ?? 0} 个已启用`,
'sidebar.overview.channelsDetail': (v) =>
`${v?.configured ?? 0} 个已配置,${v?.connected ?? 0} 个已连接` +
(Number(v?.failed) > 0 ? `,${v?.failed} 个失败` : ''),
'sidebar.overview.contextDetail': (v) =>
`${v?.files ?? 0} 个上下文文件,${v?.rules ?? 0} 条规则`,
'sidebar.overview.hooksDetail': (v) => `${v?.count ?? 0} 个 hook`,
'sidebar.overview.hooksDisabled': (v) => `${v?.count ?? 0} 个 hook(已禁用)`,
'sidebar.forceRemoveWorkspace': '强制移除',
'sidebar.removeWorkspaceTitle': '移除工作区',
'sidebar.removeWorkspaceConfirm': (v) =>
`确定移除“${v?.name ?? ''}”的运行时和持久化注册吗?文件、设置和会话历史不会被删除。`,
'sidebar.removeWorkspaceBusy': (v) =>
`“${v?.name ?? ''}”仍有活动运行时资源。强制移除会终止这些资源。`,
'sidebar.removeWorkspaceCurrentSession':
'请先切换到其他工作区或关闭当前会话,再执行强制移除。',
'sidebar.removeWorkspaceInProgress':
'另一个客户端正在移除此工作区,请在操作完成后刷新。',
'sidebar.removeWorkspaceError': '移除工作区失败',
'sidebar.removeWorkspaceSessions': (v) => `会话:${v?.count ?? 0}`,
'sidebar.removeWorkspacePrompts': (v) => `活动提示:${v?.count ?? 0}`,
'sidebar.removeWorkspaceStarts': (v) => `待启动会话:${v?.count ?? 0}`,
'sidebar.removeWorkspaceConnections': (v) => `ACP 连接:${v?.count ?? 0}`,
'sidebar.removeWorkspaceMemoryTasks': (v) => `Memory 任务:${v?.count ?? 0}`,
'sidebar.removeWorkspaceWorkers': (v) => `Channel worker:${v?.count ?? 0}`,
'sidebar.removeWorkspaceVoiceSessions': (v) => `语音会话:${v?.count ?? 0}`,
'sidebar.noSessions': '暂无会话',
'sidebar.projectFallback': '项目',
'sidebar.sessionsOverview': '会话总览',
'sidebar.splitView': '分屏',
'sidebar.settings': '设置',
'update.button': '更新',
'update.restarting': '重启中…',
'update.readyTitle': (v) => `更新至 v${v?.version} 并重启`,
'update.failed': '未能完成更新,请检查服务连接后重试。',
'sidebar.daemonStatus': 'Daemon 状态',
'sidebar.scheduledTasks': '定时任务',
'sidebar.workflows': '工作流',
'sidebar.goals': '目标',
'sidebar.themeLight': '切换到浅色主题',
'sidebar.themeDark': '切换到深色主题',
'sidebar.collapse': '收起',
'sidebar.expand': '展开',
'sidebar.showAllSessions': '展开显示',
'sidebar.collapseProject': '收起项目',
'sidebar.expandProject': '展开项目',
'sidebar.search': '搜索会话',
'sidebar.searchPlaceholder': '搜索会话',
'sidebar.rename': '重命名',
'sidebar.export': '导出对话记录',
'sidebar.exportFailed': '导出会话失败',
'sidebar.delete': '删除',
'sidebar.archive': '归档',
'sidebar.unarchive': '恢复',
'sidebar.moreActions': '更多操作',
'sidebar.archiveCurrentDisabled': '不能归档当前会话',
'sidebar.archiveRunningDisabled':
'不能归档运行中的会话,归档会终止其正在执行的工作',
'sidebar.archivedTitle': '已归档',
'sidebar.standaloneLoadFailed': '最近会话加载失败',
'sidebar.standaloneActionFailed': '会话操作失败',
'sidebar.standaloneDeleteConfirm': '删除该会话及其私有文件?',
'sidebar.standaloneCleanupPending':
'会话已删除,私有文件清理将在后台自动完成。',
'sidebar.archivedEmpty': '没有已归档的会话。',
'sidebar.archiveFailed': '归档会话失败',
'sidebar.unarchiveFailed': '恢复会话失败',
'sidebar.loadFailed': '会话加载失败,点击重试。',
'sidebar.renameFailed': '重命名会话失败',
'sidebar.deleteFailed': '删除会话失败',
'sidebar.newSessionFailed': '创建新对话失败',
'sidebar.switchFailed': '切换会话失败',
'sidebar.currentDeleteDisabled': '当前会话正在运行,不能删除',
'sidebar.currentStandaloneDeleteDisabled':
'请先打开另一个对话,再删除当前无工作区会话',
'sidebar.deleteConfirmDescription': (v) =>
`确定删除“${v?.name ?? ''}”吗?删除后不可恢复。`,
'sidebar.clients': (v) => `${v?.count ?? 0} 个客户端`,
'sidebar.running': '运行中',
'sidebar.activeWork': '有活动任务',
'sidebar.activityUnknown': '后台活动状态未知',
'sidebar.waitingForApproval': '等待批准',
'sidebar.waitingForApprovalShort': '待批准',
'sidebar.sessionPr': (v) => `合并请求 #${v?.number ?? ''}`,
'sidebar.sessionPrMultiple': (v) =>
`合并请求 #${v?.number ?? ''}(共 ${v?.count ?? 0} 个)`,
'sidebar.sessionPrStateMerged': '已合入',
'sidebar.sessionPrStateClosed': '已关闭',
'sidebar.sessionIssue': (v) => `议题 #${v?.number ?? ''}`,
'sidebar.sessionIssueStateCompleted': '已完成',
'sidebar.sessionIssueStateNotPlanned': '未计划',
'sidebar.userInputNeeded': '需要用户输入',
'sidebar.userInputNeededShort': '需输入',
'sidebar.completedUnread': '刚完成',
'sidebar.pin': '置顶',
'sidebar.unpin': '取消置顶',
'sidebar.sessionGroup': '分组',
'sidebar.groupFilter': '会话分组',
'sidebar.groupAll': '全部',
'sidebar.groupPinned': '已置顶',
'sidebar.groupUngrouped': '未分组',
'sidebar.groupRecent': '最近',
'sidebar.groupCreate': '新建分组',
'sidebar.groupRename': '重命名分组',
'sidebar.groupDelete': '删除分组',
'sidebar.groupColor': '分组颜色',
'sidebar.groupNamePrompt': '分组名称',
'sidebar.groupDeleteConfirm': (v) => `确定删除分组“${v?.name ?? ''}”吗?`,
'sidebar.groupsLoadFailed': '加载会话分组失败',
'sidebar.groupCreateFailed': '创建分组失败',
'sidebar.groupAssignFailedAfterCreate': '分组已创建,但移动会话失败',
'sidebar.groupUpdateFailed': '更新分组失败',
'sidebar.groupDeleteFailed': '删除分组失败',
'sidebar.organizationFailed': '更新会话组织失败',
'sidebar.groupColor.red': '红色',
'sidebar.groupColor.orange': '橙色',
'sidebar.groupColor.yellow': '黄色',
'sidebar.groupColor.green': '绿色',
'sidebar.groupColor.blue': '蓝色',
'sidebar.groupColor.purple': '紫色',
'sidebar.groupColor.custom': '自定义…',
'sidebar.groupColor.picker': '选择自定义分组颜色',
'sidebar.groupColor.hex': 'Hex 颜色',
'sidebar.groupColor.invalid': '请输入六位 Hex 颜色,例如 #416ef5。',
'quickKeys.retry': '重试失败请求',
'error.unsupportedTheme':
'不支持该主题。请使用 /theme light 或 /theme dark。',
'queue.delete': '删除',
'queue.edit': '编辑',
'queue.insert': '插入',
'queue.cleared': '队列已清空。',
'queue.deleteTip': '移出队列',
'queue.editTip': '移出队列并将内容放回输入框',
'queue.submitting': '提交中...',
'queue.midTurnQueued': '排队中...',
'queue.serverQueued': '服务器排队中...',
'queue.editing': '编辑中...',
'queue.inserting': '插入中...',
'queue.removing': '处理中...',
'queue.submittingDisabled': '排队消息正在提交中...',
'queue.summaryEditDisabled': '恢复的队列摘要无法还原原始附件。',
'queue.admissionUnknown': '消息是否送达尚不确定,请先检查会话再重试。',
'queue.restoreUnknown': '恢复本地副本',
'queue.discardUnknown': '丢弃本地副本',
'queue.continueEditing': '继续编辑',
'queue.continueEditingConfirm':
'这条消息可能已经在执行。只有在接受重复发送风险时才继续编辑。',
'queue.commandBlocked': '当前回合运行时,Slash 命令不能进入排队。',
'queue.commandGoalBlocked':
'Goal 正在占用会话或状态仍在加载,暂时无法执行 Slash 命令。',
'queue.shellQueued': 'Shell 命令已排队,将在当前回合结束后执行。',
'queue.shellDropped': (v) =>
`${v?.count ?? 0} 条排队的 Shell 命令将不会执行。`,
'queue.queueFailed': '排队消息失败',
'queue.attachmentCleanupFailed': '清理已上传附件失败',
'queue.deleteFailed': '移出队列失败',
'queue.editFailed': '编辑排队消息失败',
'queue.insertFailed': '插入排队消息失败',
'queue.insertTip': '插入当前回合',
'queue.insertCommandDisabled': '命令不能插入当前回合',
'queue.sendNow': '立即发送',
'queue.sendNowTip':
'立即发送排队的消息,并截断模型当前的回复(回复已开始调用工具时不截断);正在运行的工具会先执行完',
'queue.sendNowFailed': '立即发送排队消息失败',
'queue.footer': '按 ↑ 编辑最后一条排队消息 · Esc 清空队列',
'queue.imageCount': (v) => `(+${v?.count ?? 0} 张图片)`,
'queue.fileCount': (v) => `(+${v?.count ?? 0} 个文件)`,
'queue.more': (v) => `...(还有 ${v?.count ?? 0} 条)`,
'help.builtIn': '内置命令',
'help.commandCount': (v) => `${v?.count ?? 0} 个命令`,
'help.commandMeta.builtIn': '内置',
'help.commandMeta.custom': '自定义',
'help.commandMeta.subcommands': (v) => `${v?.count ?? 0} 个子命令`,
'help.commandsIntro': '浏览内置命令:',
'help.customGroup': '自定义、skills、plugins、MCP',
'help.customIntro': '浏览自定义、skill、plugin 和 MCP 命令:',
'help.empty': '当前没有可用命令。',
'help.emptyCustom': '当前没有可用的自定义命令。',
'help.footer': 'Tab/Shift+Tab 切换标签 · ↑/↓ 或 PgUp/PgDn 滚动 · Esc 关闭',
'help.intro':
'Qwen Code 可以理解代码库,在你的许可下修改文件,并直接执行命令。',
'help.section.shortcuts': '快捷键',
'help.search': '搜索命令',
'help.shortcut.addContext': '添加文件或目录作为上下文',
'help.shortcut.altWords': '按词跳转',
'help.shortcut.clear': '清屏',
'help.shortcut.commandMenu': '打开命令菜单',
'help.shortcut.completion': '接受补全或切换帮助标签',
'help.shortcut.history': '切换历史 prompt 或滚动列表',
'help.shortcut.searchHistory': '搜索历史 prompt',
'help.shortcut.newline': '插入换行',
'help.shortcut.pasteImages': '粘贴图片',
'help.shortcut.shell': '运行 shell 命令',
'help.shortcut.togglePanel': '切换此面板',
'help.shortcut.retry': '重试上次请求',
'retry.hint': '按 Ctrl+Y 重试或点击重试',
'retry.none': '没有可重试的失败请求。',
'system.taskNotification': '后台任务通知',
'background.result': '后台结果',
'background.agent': '后台智能体',
'background.running': '后台任务执行中',
'background.task': '后台任务',
'background.peer': '跨会话消息',
'background.details': '查看详情',
'background.processing': (v) => `正在处理 ${v?.label ?? ''} 结果`,
'background.source': '来源',
'background.pending': '等待处理',
'system.taskCompleted': '后台任务执行完成',
'system.taskFailed': '后台任务执行失败',
'system.taskCancelled': '后台任务已取消',
'notification.shell.completed': (v) =>
`后台 Shell 已完成:${v?.command ?? ''}`,
'notification.shell.failed': (v) =>
`后台 Shell 执行失败:${v?.command ?? ''}`,
'notification.shell.cancelled': (v) =>
`后台 Shell 已取消:${v?.command ?? ''}`,
'notification.monitor.completed': (v) =>
`监控器已完成(${v?.events ?? 0} 个事件${
v?.droppedLines ? `,因限流丢弃 ${v.droppedLines} 行` : ''
}):${v?.description ?? ''}`,
'notification.monitor.failed': (v) =>
`监控器执行失败(${v?.events ?? 0} 个事件${
v?.droppedLines ? `,因限流丢弃 ${v.droppedLines} 行` : ''
}):${v?.description ?? ''}`,
'notification.monitor.cancelled': (v) =>
`监控器已取消(${v?.events ?? 0} 个事件${
v?.droppedLines ? `,因限流丢弃 ${v.droppedLines} 行` : ''
}):${v?.description ?? ''}`,
'notification.agent.completed': (v) =>
`后台智能体已完成:${v?.description ?? ''}`,
'notification.agent.failed': (v) =>
`后台智能体执行失败:${v?.description ?? ''}`,
'notification.agent.cancelled': (v) =>
`后台智能体已取消:${v?.description ?? ''}`,
'branch.failed': '分支会话失败。',
'branch.stale': '这条回复已不在当前活跃历史路径中,会话记录已刷新。',
'branch.staleRefreshFailed':
'这条回复已不在当前活跃历史路径中,且会话记录刷新失败,请重试。',
'branch.staleUnsupported':
'这条回复已不在当前活跃历史路径中,当前会话不支持从此处分支。',
'branch.success': (v) =>
`已复制会话,新会话名称为: "${v?.name ?? ''}",当前已切换到新的会话。`,
'branch.dialog.title': '分支会话',
'branch.dialog.current.title': '当前工作区',
'branch.dialog.current.description': '复制对话,并继续使用当前检出目录。',
'branch.dialog.worktree.title': '新 Worktree',
'branch.dialog.worktree.description':
'从当前 Git HEAD 创建隔离检出目录;不会把文件恢复到这条回复时的状态。',
'branch.dialog.cancel': '取消',
'branch.dialog.confirm': '创建分支',
'branch.dialog.creating': '正在创建…',
'branch.worktreeActivationFailed':
'分支会话已创建,但无法自动打开它的 Worktree。请从会话列表重新打开。',
'fork.empty': '请提供任务指令。用法:/fork <指令>',
'fork.failed': (v) => `启动后台智能体失败:${v?.reason ?? ''}`,
'fork.notStarted': '后台智能体未启动。',
'fork.started': (v) =>
`已启动后台智能体:"${v?.name ?? ''}",可在后台任务中查看。`,
'command.hidden': '该命令不可用。',
'help.shortcut.approvals': '切换审批模式',
'help.shortcut.cancel': '关闭弹窗或取消操作',
'bug.failed': '加载系统信息失败,无法提交 Bug 报告。',
'bug.popupBlocked': '弹窗被拦截,请允许弹窗后重试。',
'bug.submitted': 'Bug 报告已在新标签页中打开。',
'clear.blocked': '流式输出中无法清屏 — 先按 Esc 取消。',
'error.unknown': '未知错误',
'error.modelStreamInterrupted': '模型响应流已中断,请重试。',
'error.loopDetected':
'模型在调用工具时反复尝试或达到了安全上限,因此系统停止了本轮操作。会话并未结束,你可以换一个更明确的指令继续。',
'shell.command': 'Shell 命令',
'shell.result.timedOut': '执行超时',
'shell.result.notices': '提示',
'shell.result.truncated': '输出预览已截断',
'shell.result.outputFiles': '输出文件',
'shell.result.output': '输出',
'shell.result.command': '命令',
'shell.result.copy': '复制命令',
'shell.result.details': '执行详情',
'shell.result.directory': '目录',
'shell.result.timeout': '超时设置',
'shell.result.timeoutMs': (v) => `${v?.milliseconds} 毫秒`,
'shell.result.defaultTimeout': '使用默认值',
'shell.result.exitCode': '退出码',
'shell.result.signal': '信号',
'shell.result.pending': '等待执行',
'shell.result.elapsed': '已运行',
'shell.result.lines': '输出行数',
'shell.result.bytes': '输出字节数',
'shell.result.running': '运行中',
'shell.result.completed': '已完成',
'shell.result.success': '执行成功',
'shell.result.cancelled': '已取消',
'shell.result.waiting': '等待输出…',
'shell.result.empty': '无输出',
'shell.result.exited': (v) => `退出码 ${v?.code}`,
'turnCalls.open': '查看工具调用',
'turnCalls.title': '工具调用',
'turnCalls.count': (v) => `共 ${v?.count ?? 0} 次工具调用`,
'turnCalls.tool': '工具调用',
'turnCalls.elapsed': (v) => `耗时:${v?.duration ?? ''}`,
'turnCalls.startedAt': (v) => `开始时间:${v?.time ?? ''}`,
'turnCalls.endedAt': (v) => `结束时间:${v?.time ?? ''}`,
'turnCalls.empty': '本轮没有工具调用记录',
'turnCalls.arguments': '参数',
'turnCalls.result': '结果',
'turnCalls.other': '其他',
'turnCalls.completed': '已完成',
'turnCalls.unknown': '状态未知',
'turnCalls.loading': '正在加载工具调用记录…',
'turnCalls.loadError': '未能加载本轮完整调用记录。',
'turnCalls.indexError': '未能刷新提示词列表。',
'turnCalls.unresolved': '未能在会话历史中定位这条提示词,请尝试刷新。',
'turnCalls.running': '运行中',
'turnCalls.pending': '等待中',
'turnCalls.cancelled': '已取消',
'turnCalls.filter': '按工具类型筛选',
'turnCalls.prompt': '提示词',
'turnCalls.refresh': '刷新',
'turnCalls.all': '全部工具',
'help.subcommands': '子命令',
'help.tab.commands': '内置命令',
'help.tab.custom': '自定义命令',
'help.tab.general': '快捷键',
'help.title': '帮助',
'slash.category.custom': '自定义',
'slash.category.skill': 'Skill',
'slash.category.system': '系统',
'language.changed': (v) => `UI 语言已切换为 ${v?.language ?? ''}`,
'language.current': (v) => `当前 UI 语言:${v?.language ?? ''}`,
'language.invalid': '语言无效。可用值:en, zh-CN',
'language.options': '可用选项:',
'language.set': '设置 UI 语言',
'language.usage': '用法:/language ui [en|zh-CN]',
'localCommand.noSession':
'当前还没有会话。请先发送第一条消息,再使用这个命令。',
'localCommand.diffNoWorkspace': '当前还没有可用于查看变更的工作区。',
'localCommand.logNoWorkspace': '当前还没有可用于查看历史的工作区。',
'localCommand.prsNoWorkspace': '当前还没有可用于查看拉取请求的工作区。',
'localCommand.prsUnsupported': '当前 daemon 不支持查看拉取请求。',
'local.agents': '管理智能体',
'local.bug': '提交错误报告',
'local.compress': '将上下文压缩为摘要',
'local.compressFast': '无需 AI 的快速上下文压缩',
'local.config': '通过点分路径键获取或设置配置项',
'local.diff': '显示工作区相对 HEAD 的改动统计',
'local.log': '显示工作区的提交历史',
'local.prs': '显示工作区开放的 GitHub 拉取请求',
'local.directory': '管理工作区目录',
'local.docs': '打开完整的 Qwen Code 文档',
'local.doctor': '运行安装和环境诊断',
'local.dream': '整合托管的自动记忆主题文件',
'local.effort': '设置推理模型的思考强度',
'local.export': '将当前会话历史导出到文件',
'local.forget': '从托管的自动记忆中移除匹配的条目',
'local.hooks': '管理 Qwen Code 钩子',
'local.importConfig': '从 Claude 配置导入 MCP 服务器',
'local.init': '分析项目并创建 QWEN.md 文件',
'local.insight': '根据聊天历史生成编程洞察',
'local.lsp': '显示 LSP 服务器状态',
'local.remember': '将持久记忆保存到记忆系统',
'local.summary': '生成项目摘要文件',
'local.workflows': '列出工作流运行,或协作式暂停/恢复运行中的任务',
'skilldesc.batch': '并行批量处理多个文件',
'skilldesc.dataviz': '图表与数据可视化设计指南',
'skilldesc.extensionCreator': '创建、测试和定制 Qwen Code 扩展',
'skilldesc.goalDraft': '将模糊意图改写为可验证的 /goal 目标',
'skilldesc.loop': '按计划或自定节奏循环运行提示词',
'skilldesc.newApp': '从零构建新应用的工作流',
'skilldesc.qcHelper': '解答 Qwen Code 使用相关问题',
'skilldesc.review': '审查代码变更的正确性、安全、质量与性能',
'skilldesc.simplify': '清理近期代码变更(复用与精简)',
'skilldesc.stuck': '诊断卡死或缓慢的 Qwen Code 会话',
'skilldesc.agentReproduceAlign':
'将已移植的 Codex/Claude Code 功能与原版对齐',
'skilldesc.agentReproduceFeature': '复现 Codex/Claude Code 的现有功能',
'skilldesc.autofix': '审查并修复本地改动,或运行仓库 Autofix 工作流',
'skilldesc.bugfix': '按先复现流程修复 GitHub issue 中的 bug',
'skilldesc.codegraph': '通过图数据库和向量索引分析代码库',
'skilldesc.createIssue': '根据想法或 bug 描述起草并提交 GitHub issue',
'skilldesc.docsAuditAndRefresh': '对照代码库审计并刷新 docs/ 文档',
'skilldesc.docsUpdateFromDiff': '按本地 git diff 更新官方文档',
'skilldesc.e2eTesting': '运行 Qwen Code CLI 的端到端测试',
'skilldesc.featDev': '实现非平凡功能的端到端工作流',
'skilldesc.memoryLeakDebug': '用堆快照诊断 CLI 内存泄漏',
'skilldesc.preparePr': '从当前分支准备 GitHub PR 标题和正文',
'skilldesc.qwenCodeClaw': '将 Qwen Code 用作代码理解智能体',
'skilldesc.structuredDebugging': '假设驱动的疑难 bug 调试方法',
'skilldesc.terminalCapture': '自动化终端 UI 截图测试',
'skilldesc.tmuxRealUserTesting': '用 tmux 做真实用户测试并保存日志',
'skilldesc.triage': '把关和审查 Qwen Code 的 issue 与 PR',
'local.approvalMode': '切换审批模式',
'local.auth': '连接 LLM provider',
'auth.title': '连接 Provider',
'auth.step.group': '类型',
'auth.step.provider': '供应商',
'auth.step.protocol': '协议',
'auth.step.api': 'API',
'auth.step.baseUrl': 'Base URL',
'auth.step.apiKey': 'API Key',
'auth.step.models': '模型 ID',
'auth.step.advanced': '高级配置',
'auth.protocol.openai': 'OpenAI 兼容',
'auth.protocol.openaiDesc': '标准 OpenAI API 格式(最常用)',
'auth.protocol.anthropic': 'Anthropic 兼容',
'auth.protocol.anthropicDesc': 'Anthropic Messages API 格式',
'auth.protocol.gemini': 'Gemini 兼容',
'auth.protocol.geminiDesc': 'Google Gemini API 格式',
'auth.api.chatCompletions': 'Chat Completions',
'auth.api.responses': 'Responses',
'auth.apiKeyRequired': 'API key 不能为空。',
'auth.baseUrlInvalid': 'Base URL 必须以 http:// 或 https:// 开头。',
'auth.baseUrlPrompt': '输入此协议的 API endpoint。',
'auth.baseUrlRequired': 'Base URL 不能为空。',
'auth.documentation': '文档',
'auth.modelsRequired': '模型 ID 不能为空。',
'auth.review': '确认',
'auth.reviewText': '保存前请确认连接信息和模型参数。',
'auth.save': '保存',
'auth.saving': '正在保存...',
'auth.termsTitle': '服务条款和隐私声明',
'auth.continue': '继续',
'auth.modelsPrompt': (v) =>
`输入以逗号分隔的模型 ID。例如:${v?.modelIds ?? ''}`,
'auth.advanced.prompt': '可选:配置高级生成设置。',
'auth.advanced.thinking': '启用 thinking',
'auth.advanced.thinkingDesc': '启用扩展推理;不勾选时保留模型默认行为。',
'auth.advanced.modality': '启用多模态',
'auth.advanced.modalityDesc': '启用图片、视频等多模态输入能力。',
'auth.advanced.modalityImage': '图片',
'auth.advanced.modalityVideo': '视频',
'auth.advanced.modalityAudio': '音频',
'auth.advanced.modalityPdf': 'PDF',
'auth.advanced.contextWindow': '上下文窗口',
'auth.advanced.contextDesc':
'模型的上下文窗口 Token 容量,留空根据模型 ID 自动推断。',
'auth.advanced.contextPlaceholder': '上下文窗口(可选)',
'auth.advanced.maxTokens': '最大输出 Token',
'auth.advanced.maxTokensDesc':
'每次回复的最大 Token 数,留空根据模型 ID 自动推断。',
'auth.advanced.tokenLimitInvalid': (v) =>
`${v?.field ?? 'Token 上限'}必须是 1 到 10,000,000 之间的整数。`,
'auth.advanced.modalitiesRequired':
'请至少选择一种输入类型,或关闭多模态选项。',
'auth.advanced.defaults': '使用模型默认值',
'auth.apiKeySet': '已设置(隐藏)',
'local.btw': '快速问一个不影响主对话的侧边问题。用法:/btw <your question>',
'btw.empty': '请提供一个问题。用法:/btw <你的问题>',
'btw.side.empty': '请提供一个问题。用法:/btw side <你的问题>',
'btw.emptyAnswer': '未收到回答。',
'btw.failed': '回答 btw 问题失败',
'btw.answering': '+ 正在回答...',
'btw.shortcuts.pending': '按 Escape、Ctrl+C 或 Ctrl+D 取消',
'btw.shortcuts.done': '按 Space、Enter 或 Escape 关闭',
'local.clear':
'以空上下文开始新会话;之前的会话会保留在磁盘上(可用 /resume 恢复)',
'local.context':
'显示上下文窗口使用情况明细。使用 "/context detail" 查看逐项明细',
'local.copy': '复制最后输出或代码片段',
'local.delete': '永久删除会话',
'local.release': '释放 live session',
'local.rewind': '回退当前会话',
'local.branch': '将当前对话分叉到新会话',
'local.fork': '基于当前对话启动后台智能体',
'local.help': '查看帮助和可用命令',
'local.language': '切换 UI 语言',
'local.mcp': '管理 MCP servers',
'local.memory': '管理 memory',
'local.model': '切换模型或设置 fast model',
'local.new': '开始新对话',
'local.plan': '进入 Plan 模式',
'local.goal': '设置目标并持续工作直到完成',
'local.recap': '生成会话摘要',
'recap.label': '回顾',
'recap.loading': '正在生成摘要...',
'recap.empty': '对话内容还不够,暂时无法生成摘要。',
'recap.failed': '生成摘要失败',
'rewind.action': '回退',
'rewind.confirm': '确认回退',
'rewind.empty': '当前会话没有可回退的快照。',
'rewind.failed': (v) => `回退会话失败:${v?.reason ?? ''}`,
'rewind.loading': '正在加载可回退的 prompt...',
'rewind.promptFallback': (v) => `Prompt ${v?.id ?? ''}`,
'rewind.rewinding': '回退中...',
'rewind.subtitle': '仅回退会话,不涉及文件。',
'rewind.title': '回退会话',
'rewind.turn': (v) => `第 ${v?.turn ?? 0} 个 prompt`,
'local.rename': '重命名当前会话',
'rename.empty':
'请输入会话名称,例如 /rename 项目调试,或使用 /rename --auto。',
'rename.success': (v) => `会话已重命名为 ${v?.name ?? ''}`,
'local.reset': '重置当前对话',
'local.resume': '恢复历史会话',
'local.skills': '查看可用 skills',
'local.stats': '查看会话统计',
'local.tasks': '查看后台任务',
'local.status': '查看版本信息',
'local.theme': '切换主题',
'local.settings': '查看和编辑设置',
'local.schedule': '管理定时任务',
'local.extensions': '管理扩展。用法: /extensions manage|install <source>',
'extensions.label': '扩展',
'extensions.action.failed': (v) =>
`扩展操作失败${v?.name ? `(${v.name})` : v?.source ? `(${v.source})` : ''}:${
v?.error ?? '未知错误'
}`,
'extensions.commands.refreshFailed': '刷新扩展命令失败。',
'extensions.install.failed': (v) =>
`安装扩展失败${v?.source ? `(${v.source})` : ''}:${
v?.error ?? '未知错误'
}`,
'extensions.manage.agents': '智能体:',
'extensions.manage.actions': '扩展操作',
'extensions.manage.add': '添加',
'extensions.manage.checkingUpdates': '正在检查更新...',
'extensions.manage.checkUpdates': '检查更新',
'extensions.manage.commands': '命令:',
'extensions.manage.contextFiles': '上下文文件:',
'extensions.manage.count': (v) => `已安装 ${v?.count ?? 0} 个扩展`,
'extensions.manage.setting.disabled': '禁用',
'extensions.manage.setting.default': '默认',
'extensions.manage.setting.enabled': '启用',
'extensions.manage.setting.unknown': '状态不可用',
'extensions.manage.setting.unavailableDescription':
'当前服务未返回扩展的全局和工作区设置,请重启 qwen serve 后重试。',
'extensions.manage.userSetting': '全局设置',
'extensions.manage.userSettingDescription':
'适用于用户工作区,工作区设置可单独覆盖。',
'extensions.manage.workspaceSetting': '工作区设置',
'extensions.manage.workspaceSettingDescription': '仅适用于当前工作区。',
'extensions.manage.disable': '禁用扩展',
'extensions.manage.disabled': (v) => `扩展 "${v?.name ?? '扩展'}" 已禁用。`,
'extensions.manage.disabling': (v) => `正在禁用扩展 "${v?.name ?? '扩展'}"…`,
'extensions.manage.inherited': (v) =>
`扩展 "${v?.name ?? '扩展'}" 已恢复为全局设置。`,
'extensions.manage.inheriting': (v) =>
`正在将扩展 "${v?.name ?? '扩展'}" 恢复为全局设置…`,
'extensions.manage.empty': '未安装扩展。',
'extensions.manage.emptyAgents': '此扩展没有智能体。',
'extensions.manage.emptyCommands': '此扩展没有命令。',
'extensions.manage.emptyContextFiles': '此扩展没有上下文文件。',
'extensions.manage.emptyDescription':
'安装扩展以添加命令、Skills、智能体或 MCP servers。',
'extensions.manage.emptyMcpServers': '此扩展没有 MCP servers。',
'extensions.manage.emptySkills': '此扩展没有 Skills。',
'extensions.manage.enable': '启用扩展',
'extensions.manage.enabled': (v) => `扩展 "${v?.name ?? '扩展'}" 已启用。`,
'extensions.manage.enabling': (v) => `正在启用扩展 "${v?.name ?? '扩展'}"…`,
'extensions.manage.install': '安装',
'extensions.manage.installDescription':
'输入 GitHub、Git 或 npm 扩展来源,或上传 Extension 压缩包。',
'extensions.manage.sourceTab': '来源',
'extensions.manage.archiveTab': '压缩包',
'extensions.manage.archiveSelect': '选择 .zip 或 .tar.gz 压缩包。',
'extensions.manage.archiveSelected': (v) =>
`已选择压缩包:${v?.name ?? 'Extension 压缩包'}`,
'extensions.manage.archiveTooLarge': 'Extension 压缩包不能超过 10 MB。',
'extensions.manage.archiveEmpty': '所选 Extension 压缩包为空。',
'extensions.manage.archiveInvalid':
'请选择文件名有效且不超过 255 字节的 .zip 或 .tar.gz Extension 压缩包。',
'extensions.manage.installSelectPluginDescription': (v) =>
`从「${v?.marketplace ?? '此市场'}」中选择插件。`,
'extensions.manage.installTitle': '添加扩展',
'extensions.manage.installType': '安装类型:',
'extensions.manage.mcpServers': 'MCP servers:',
'extensions.manage.marketplaceRoot': '此市场根目录',
'extensions.manage.name': '名称:',
'extensions.manage.notUpdatable': '不可更新',
'extensions.manage.operationFailed': '扩展操作失败。',
'extensions.manage.noDescription': '暂无描述',
'extensions.manage.noMatches': '没有匹配的扩展。',
'extensions.manage.origin': '来源平台:',
'extensions.manage.overview': '基本信息',
'extensions.manage.path': '路径:',
'extensions.manage.queued': (v) =>
`扩展 "${v?.name ?? '扩展'}" 的操作已提交。`,
'extensions.manage.refreshFailed': (v) =>
`扩展操作已成功,但 session 刷新失败${v?.error ? `:${v.error}` : '。'}`,
'extensions.manage.restartRequired': '已更新,需要重启',
'extensions.manage.search': '搜索扩展…',
'extensions.manage.selectExtension': '请选择扩展',
'extensions.manage.settings': '设置:',
'extensions.manage.skills': 'Skills:',
'extensions.manage.source': '来源:',
'extensions.manage.sourcePlaceholder': 'https://github.com/owner/repository',
'extensions.manage.status': '状态:',
'extensions.manage.status.disabled': '已禁用',
'extensions.manage.status.enabled': '已启用',
'extensions.manage.title': '管理扩展',
'extensions.manage.unknownUpdate': '未知',
'extensions.manage.uninstalled': (v) =>
`扩展 "${v?.name ?? '扩展'}" 已卸载。`,
'extensions.manage.uninstalling': (v) =>
`正在卸载扩展 "${v?.name ?? '扩展'}"…`,
'extensions.manage.uninstallAction': '卸载扩展',
'extensions.manage.uninstallConfirm': (v) =>
`确定卸载扩展 "${v?.name ?? '扩展'}"?`,
'extensions.manage.upToDate': '已是最新',
'extensions.manage.update': '更新扩展',
'extensions.manage.updateAvailable': '有可用更新',
'extensions.manage.updateError': '检查更新失败',
'extensions.manage.updateComplete': '已更新',
'extensions.manage.updatedWithWarnings': '已更新,但有警告',
'extensions.manage.updateStatus': '更新状态:',
'extensions.manage.updating': '正在更新…',
'extensions.manage.updatingExtension': (v) =>
`正在更新扩展 "${v?.name ?? '扩展'}"…`,
'extensions.manage.updated': (v) => `扩展 "${v?.name ?? '扩展'}" 已更新。`,
'extensions.manage.updatedWithVersion': (v) =>
`扩展 "${v?.name ?? '扩展'}" 已更新到 v${v?.version ?? ''}。`,
'extensions.manage.version': '版本:',
'extensions.manage.viewDetails': '查看详情',
'extensions.install.installed': (v) => `扩展 "${v?.name ?? '扩展'}" 已安装。`,
'extensions.install.installedWithVersion': (v) =>
`扩展 "${v?.name ?? '扩展'}" v${v?.version ?? ''} 已安装。`,
'extensions.install.missingOptionValue': (v) =>
`${v?.option ?? '选项'} 缺少值`,
'extensions.install.requestFailed': '安装扩展失败',
'extensions.install.started': (v) =>
`正在从 "${v?.source ?? ''}" 安装扩展...`,
'extensions.install.unknownOption': (v) => `未知选项 ${v?.option ?? ''}`,
'extensions.install.usage': '用法: /extensions manage|install <source>',
'extensions.install.waitForSession': '等待会话连接后再安装扩展。',
'local.tools': '列出可用工具。用法: /tools [desc]',
'loadWarning.commands': '命令列表加载失败,斜杠命令可能不完整。',
'loadWarning.context': '会话上下文加载失败,当前模式可能不准确。',
'loadWarning.models': '模型列表加载失败,部分模型详情可能不可用。',
'mcp.action.auth': '认证',
'mcp.action.authHint': 'daemon 尚未暴露',
'mcp.action.authMessage': 'daemon serve 尚未暴露 MCP 认证能力。',
'mcp.action.clearAuth': '清空认证',
'mcp.action.disable': '禁用',
'mcp.action.done': (v) => `${v?.action ?? '操作'}完成。`,
'mcp.action.enable': '启用',
'mcp.action.enableMessage': 'daemon serve 尚未暴露 MCP 启用/禁用能力。',
'mcp.action.failed': (v) => `失败:${v?.error ?? ''}`,
'mcp.action.running': (v) => `${v?.action ?? '操作'}中...`,
'mcp.action.reauth': '重新认证',
'mcp.action.approve': '审批',
'mcp.actions': '服务器操作',
'mcp.annotation.destructive': '破坏性',
'mcp.annotation.idempotent': '幂等',
'mcp.annotation.openWorld': '开放世界',
'mcp.annotation.readOnly': '只读',
'mcp.annotations': '注解',
'mcp.oauth.server': '服务器',
'mcp.oauth.starting': (v) =>
`正在为 MCP server '${v?.name ?? ''}' 启动 OAuth 认证...`,
'mcp.oauth.title': 'OAuth 认证',
'mcp.oauth.timeout': '认证等待超时,请刷新后查看状态。',
'mcp.oauth.authenticationFailed': '认证失败。',
'mcp.oauth.statusFailed': '检查认证状态失败。',
'mcp.oauth.serverRemoved': 'MCP 服务器已在认证期间被移除。',
'mcp.clientBudget': (v) =>
`${v?.count ?? 0}/${v?.budget ?? 0} 个客户端 · ${v?.mode ?? 'off'}`,
'mcp.command': '命令',
'mcp.description': '描述:',
'mcp.descriptionTitle': '描述',
'mcp.basicInfo': '基本信息',
'mcp.action.reconnect': '重新连接',
'mcp.action.edit': '编辑',
'mcp.reconnect.skipped': (v) =>
`重新连接未完成:${v?.reason ?? '未知原因'}。`,
'mcp.reconnect.authenticationRequired': '请先完成认证,再重新连接。',
'mcp.action.restart': '重启',
'mcp.action.tools': '查看工具',
'mcp.action.toolsHint': 'Enter 查看',
'mcp.empty': '未配置 MCP 服务器。',
'mcp.emptyDescription': '添加 MCP 服务器后可在此管理。',
'mcp.emptyTools': '没有发现工具。',
'mcp.expand': '展开 MCP server',
'mcp.collapse': '收起 MCP server',
'mcp.inputSchema': '输入 schema',
'mcp.loadingStatus': '正在加载 MCP 状态...',
'mcp.loadingTools': '正在加载工具...',
'mcp.name': '名称',
'mcp.noDescription': '没有描述',
'mcp.noMatches': '没有匹配的 MCP 服务器。',
'mcp.add.button': '添加',
'mcp.add.adding': '正在添加 MCP 服务器…',
'mcp.add.title': '添加 MCP 服务器',
'mcp.add.description': '输入服务器名称和配置,并保存到当前工作区。',
'mcp.add.name': '名称',
'mcp.add.serverDescription': '描述',
'mcp.add.serverDescriptionPlaceholder': '描述这个 MCP 服务器',
'mcp.add.scope': '保存位置',
'mcp.add.scope.global': '全局',
'mcp.add.nameRequired': '请输入 MCP 服务器名称。',
'mcp.add.config': '配置(JSON)',
'mcp.add.configInvalid': '配置必须是 JSON 对象。',
'mcp.add.done': (v) => `已添加 ${v?.name ?? 'MCP 服务器'}。`,
'mcp.edit.title': '编辑 MCP 服务器',
'mcp.edit.description': '修改描述或配置。名称和保存位置不可修改。',
'mcp.edit.save': '保存修改',
'mcp.edit.saving': '正在保存修改…',
'mcp.edit.done': (v) => `已更新 ${v?.name ?? 'MCP 服务器'}。`,
'mcp.edit.notFound': '设置中已不存在该 MCP 服务器。',
'mcp.runtime.notUpdated': '配置已保存,但未同步当前会话。',
'mcp.runtime.removeNotUpdated': '配置已删除,但未同步当前会话。',
'mcp.discovery.empty': '尚未配置 MCP 服务器。',
'mcp.discovery.timeout': 'MCP 发现耗时较长,请刷新后查看状态。',
'mcp.add.settingsUnavailable': '无法读取工作区设置。',
'mcp.action.remove': '删除',
'mcp.remove.title': '删除 MCP 服务器',
'mcp.remove.description': (v) =>
`确定从当前工作区移除 MCP 服务器“${v?.name ?? ''}”吗?`,
'mcp.remove.description.global': (v) =>
`确定从全局设置中移除 MCP 服务器“${v?.name ?? ''}”吗?`,
'mcp.remove.done': (v) => `已删除 ${v?.name ?? 'MCP 服务器'}。`,
'mcp.remove.notWorkspace': '此 MCP 服务器不在工作区设置中。',
'mcp.source.all': '全部',
'mcp.noSchema': '没有输入 schema。',
'mcp.oauth.open': '打开认证页面',
'mcp.serverTool': '服务器工具',
'mcp.servers': (v) => `${v?.count ?? 0} 个服务器`,
'mcp.configuredServers': '已配置的 MCP 服务器:',
'mcp.fromExtension': (v) => `(来自 ${v?.name ?? ''})`,
'mcp.extensionMcp': '扩展 MCP',
'mcp.invalidReason': (v) => `无效:${v?.reason ?? ''}`,
'mcp.invalidReasonLabel': '原因:',
'mcp.invalidToolHelp':
'工具必须同时包含 name 和 description 才能被 LLM 使用。',
'mcp.invalidToolWarning': '警告:这个工具不能被 LLM 调用',
'mcp.manageServers': '管理 MCP servers',
'mcp.viewDetails': '查看详情',
'mcp.parameters': '参数:',
'mcp.required': ' 必填',
'mcp.resources': '资源',
'mcp.resourcesUnavailable': '无法加载资源详情。',
'mcp.noResources': '没有资源。',
'mcp.resourceCount': (v) => `${v?.count ?? 0} 个资源`,
'mcp.promptCount': (v) => `${v?.count ?? 0} 个提示词`,
'mcp.resource.uriLabel': 'URI:',
'mcp.resource.nameLabel': '名称:',
'mcp.resource.mimeTypeLabel': 'MIME 类型:',
'mcp.resource.sizeLabel': '大小:',
'mcp.resource.bytes': (v) => `${v?.count ?? 0} 字节`,
'mcp.scrollPosition': (v) => `${v?.current ?? 0}/${v?.total ?? 0}`,
'mcp.shortcut.back': 'Esc 返回',
'mcp.shortcut.close': 'Esc 关闭',
'mcp.shortcut.selectBack': '↑↓ 导航 · Enter 选择 · Esc 返回',
'mcp.shortcut.selectClose': '↑↓ 导航 · Enter 选择 · Esc 关闭',
'mcp.settings': '设置',
'mcp.extension': (v) => `扩展:${v?.name ?? ''}`,
'mcp.starting': (v) =>
`⏳ MCP 服务器正在启动(${v?.count ?? 0} 个初始化中)...`,
'mcp.startingNote': '注意:首次启动可能需要更长时间。工具可用性会自动更新。',
'mcp.restartSkipped': (v) => `已跳过 ${v?.name ?? ''}:${v?.reason ?? ''}`,
'mcp.restarted': (v) => `已重启 ${v?.name ?? ''},耗时 ${v?.duration ?? 0}ms`,
'mcp.restartEntries': (v) =>
`已重启 ${v?.name ?? ''} 的 ${v?.restarted ?? 0}/${v?.total ?? 0} 个条目${v?.failedReasons ? `(失败:${v.failedReasons})` : ''}`,
'mcp.source': '来源',
'mcp.source.extension': '扩展',
'mcp.source.project': '项目 MCP(.mcp.json)',
'mcp.source.workspace': '工作区设置',
'mcp.source.user': '全局设置',
'mcp.status': '状态',
'mcp.status.blocked': '已阻止',
'mcp.status.authenticating': '认证中',
'mcp.status.authenticationFailed': '认证失败',
'mcp.status.needsAuthentication': '待认证',
'mcp.status.needsApproval': '待审批',
'mcp.status.rejected': '已拒绝',
'mcp.status.connected': '已连接',
'mcp.status.connecting': '连接中',
'mcp.status.disconnected': '未连接',
'mcp.status.disconnectedTitle': '已断开',
'mcp.status.disabled': '已禁用',
'mcp.status.ready': '就绪',
'mcp.status.starting': '启动中...(首次启动可能需要更长时间)',
'mcp.status.unknown': '未知',
'mcp.tipDesc': '显示 server 和工具描述',
'mcp.tipNodesc': '隐藏描述',
'mcp.tipSchema': '显示工具参数 schema',
'mcp.tips': '💡 提示:',
'mcp.toolCount': (v) => `${v?.count ?? 0} 个工具`,
'mcp.toolsCount': (v) => `${v?.count ?? 0} 个工具`,
'mcp.toolsLabel': '工具:',
'mcp.title': 'MCP 服务器',
'mcp.toolDetail': '工具详情',
'mcp.tools': '工具',
'mcp.toolsForServer': (v) => `${v?.name ?? 'Server'} 的工具`,
'mcp.transport': '传输协议',
'mcp.use': '使用',
'mcp.userMcp': '全局 MCP',
'mcp.workingDirectory': '工作目录',
'goal.aborted': '目标已中止',
'goal.blocked': '目标已阻塞',
'goal.usageLimited': '目标用量受限',
'goal.paused': '目标已暂停',
'goal.achieved': '目标已达成',
'goal.check': '目标检查',
'goal.cleared': '目标已清除',
'goal.failed': '目标未能达成',
'goal.judge': '判断',
'goal.label': '目标',
'goal.lastCheck': '上次检查',
'goal.notYetMet': '尚未满足',
'goal.set': '目标已设置',
'goal.statusActive': '/goal 运行中',
'goal.status.active': '进行中',
'goal.status.paused': '已暂停',
'goal.status.blocked': '已阻塞',
'goal.status.usage_limited': '用量受限',
'goal.status.complete': '已完成',
'goal.activity.idle': '等待中',
'goal.activity.running': '执行中',
'goal.activity.verifying': '验证中',
'goal.edit': '编辑目标',
'goal.pause': '暂停目标',
'goal.resume': '继续目标',
'goal.turn': (v) => `${v?.count ?? 0} 轮`,
'goal.turnLabel': (v) => `第 ${v?.count ?? 0} 轮`,
'goal.turns': (v) => `${v?.count ?? 0} 轮`,
'goal.turnsOfBudget': (v) => `${v?.count ?? 0} / ${v?.budget ?? 0} 轮`,
'goal.activeOfBudget': (v) => `${v?.used ?? ''} / ${v?.budget ?? ''}`,
'goal.tokens': (v) => `已用 ${v?.used ?? 0} tokens`,
'goal.tokensOfBudget': (v) =>
`已用 ${v?.used ?? 0} / ${v?.budget ?? 0} tokens`,
'goals.title': '目标',
'goals.subtitle':
'目标会让所在会话持续工作,直到条件满足。这里只列出当前已加载的会话——目标只在会话运行时才会推进。',
'goals.loading': '正在加载目标…',
'goals.count': (v) => `${v?.count ?? 0} 个进行中的目标`,
'goals.empty': '没有进行中的目标。用 /goal <条件> 设置一个。',
'goals.refresh': '刷新',
'goals.new': '新建目标',
'goals.newHint':
'目标会在一个新会话中启动,并持续运行直到条件满足。如需强制的轮数或时长上限,请在对话中运行 /config model.goalMaxTurns=20 或 /config model.goalMaxActiveMinutes=30,daemon 重启后生效,且只对之后新建的 Goal 生效。',
'goals.condition': '条件',
'goals.conditionPlaceholder':
'例如:`npm test` 退出码为 0 且 `npm run lint` 无告警(贴出输出);不得修改测试文件;模型参考 20 轮内未达成则以 blocked 结束',
'goals.cancel': '取消',
'goals.create': '设置目标',
'goals.creating': '正在启动…',
'goals.saving': '正在保存…',
'goals.save': '保存',
'goals.edit': '编辑目标',
'goals.objective': '目标',
'goals.clear': '清除目标',
'goals.clearConfirm': (v) => `确定清除目标“${v?.condition ?? ''}”?`,
'goals.running': '工作中',
'goals.idle': '等待中',
'goals.dropped': (v) =>
`有 ${v?.count ?? 0} 个会话无法访问——它们正在运行的目标未显示在此列表中。`,
'goals.notYetEvaluated': '尚未判定',
'goals.openSessionHint': '打开该目标所在的会话',
'goals.error.emptyCondition': '请输入目标条件。',
'goals.error.clearKeyword': (v) =>
`“${v?.word ?? ''}”是清除目标的指令,不是一个条件。请描述要达成的条件。`,
'goals.error.createFailed': '启动目标失败',
'goals.error.saveFailed': '保存目标失败',
'goals.error.goalUnavailable': '该目标已不可用。',
'goals.error.requiresObjective': (v) =>
`/goal ${v?.keyword ?? 'set'} 需要提供目标内容。`,
'goals.error.invalidCommand': '无效的 /goal 命令',
'goals.error.goalsUnavailable': '当前界面不支持打开目标视图。',
'goals.error.attachmentsUnsupported': '使用 /goal 前请先移除附件。',
'goals.error.editFailed': '编辑目标失败',
'goals.error.pauseFailed': '暂停目标失败',
'goals.error.resumeFailed': '继续目标失败',
'goals.error.clearFailed': '清除目标失败',
'goals.error.controlBusy': '还有一个目标操作正在进行,请等它完成后再试。',
'memory.add': '添加',
'memory.add.desc': '写入一条持久 memory',
'memory.autoDream': (v) =>
`自动整理:${v?.status ?? '未知'} · ${v?.lastDream ?? '从未'} · /dream 立即运行`,
'memory.autoDreamUnsupported': 'web-shell 暂不支持修改自动整理设置。',
'memory.autoFolder': '打开自动记忆文件夹',
'memory.autoMemory': (v) => `自动记忆:${v?.status ?? '未知'}`,
'memory.autoMemoryUnsupported': 'web-shell 暂不支持修改自动记忆设置。',
'memory.autoSkill': (v) => `自动技能:${v?.status ?? '未知'}`,
'memory.autoSkillUnsupported': 'web-shell 暂不支持修改自动技能设置。',
'memory.chooseScope': '选择 memory 的保存位置',
'memory.closed': 'Memory 面板已关闭。',
'memory.contentEmpty': 'Memory 内容为空。',
'memory.file': 'Memory 文件',
'memory.fileOpen': 'Memory 文件已打开。',
'memory.fileTruncated': 'Memory 文件已打开,内容已截断。',
'memory.files': 'Memory 文件',
'memory.footer': 'Enter 确认 · Esc 取消',
'memory.footer.back': 'Esc 返回',
'memory.global': '用户级',
'memory.global.desc': '保存到全局用户 memory 文件',
'memory.globalReadUnsupported':
'全局 memory 位于当前 workspace 之外,当前 daemon 文件读取接口不能打开它的内容。',
'memory.loading': '正在加载 memory...',
'memory.loadingFile': '正在加载 memory 文件...',
'memory.lastDream': '5 hours ago',
'memory.menu': 'Memory',
'memory.never': '从未',
'memory.noFiles': '未找到 memory 文件。',
'memory.on': '开',
'memory.openFolderUnsupported': 'web-shell 暂不支持打开自动记忆文件夹。',
'memory.placeholder': (v) => `写入${v?.scope ?? 'memory'}内容...`,
'memory.project': '项目级',
'memory.project.desc': '保存到当前 workspace memory 文件',
'memory.refresh': '刷新',
'memory.refresh.desc': '重新加载 memory 文件信息',
'memory.refreshed': 'Memory 已刷新。',
'memory.save': '保存 Memory',
'memory.savedIn': (v) => `Saved in ${v?.path ?? ''}`,
'memory.saved': (v) =>
`${v?.scope ?? 'Memory'} 已保存:${v?.bytes ?? 0} 字节 -> ${v?.path ?? ''}`,
'memory.saving': '保存中...',
'memory.show': '查看',
'memory.show.desc': '查看已配置的 memory 文件',
'memory.status': 'Workspace 和用户 memory 文件',
'memory.unknown': '未知',
'memory.write': '写入 memory 内容',
'mode.auto': '智能审批',
'mode.auto.desc':
'使用分类器评估工具调用,安全操作自动批准,风险操作阻止或请求确认',
'mode.auto.notice':
'Auto 模式已启用。LLM 分类器会评估每个工具调用,自动批准安全操作,拦截危险操作。退出方式:Shift+Tab 或 /approval-mode default。',
'mode.footer': '(Enter 选择,Esc 取消)',
'mode.name.plan': 'plan',
'mode.name.default': 'default',
'mode.name.auto-edit': 'auto-edit',
'mode.name.auto': 'auto',
'mode.name.yolo': 'yolo',
'plan.toggle.on': '执行前先制定计划',
'plan.toggle.off': (v) => `规划中,批准后按${v?.mode}执行。点击退出规划。`,
'approval.option.executePlan': (v) => `批准并执行 · ${v?.mode}`,
'mode.label.plan': '计划',
'mode.label.default': '请求批准',
'mode.label.auto-edit': '自动编辑',
'mode.label.auto': '智能审批',
'mode.label.yolo': '完全访问权限',
'mode.listLabel.plan': '计划(plan)',
'mode.listLabel.default': '请求批准(default)',
'mode.listLabel.auto-edit': '自动编辑(auto-edit)',
'mode.listLabel.auto': '智能审批(auto)',
'mode.listLabel.yolo': '完全访问权限(yolo)',
'mode.desc.plan': '仅分析,不修改文件或执行命令',
'mode.desc.default': '执行命令、编辑文件或访问外部资源前请求确认',
'mode.desc.auto-edit': '自动批准文件编辑,命令执行等敏感操作仍会询问',
'mode.desc.auto': '自动评估工具风险,安全操作直接执行,风险操作再确认',
'mode.desc.yolo': '自动批准所有工具调用,适合可信任务环境',
'mode.select': '审批模式',
'mode.changePending': '模式切换或计划确认尚未完成,请稍后重试。',
'mode.autoApproved': ((v) =>
v?.tool
? `已自动批准:${v.tool}`
: '切换模式后自动批准了待处理的工具调用。') as MessageValue,
'mode.auto-edit': '自动编辑',
'mode.auto-edit.desc': '自动批准文件读写操作',
'mode.default': '默认模式',
'mode.default.desc': '每次工具调用都需要确认',
'mode.plan': 'Plan 模式',
'mode.plan.desc': '仅分析和规划,不执行工具',
'mode.unknown': '未知模式',
'mode.yolo': 'YOLO 模式',
'mode.yolo.desc': '自动批准所有操作',
'plan.title': '计划',
'model.contextWindow': '上下文窗口',
'model.contextWindow.unknown': '(未知)',
'model.current': (v) => `当前:${v?.model ?? '未知'}`,
'model.modality': '模态',
'model.modality.text': '文本',
'model.modality.textOnly': '仅文本',
'model.modality.image': '图片',
'model.modality.pdf': 'PDF',
'model.modality.audio': '音频',
'model.modality.video': '视频',
'model.baseUrl': 'Base URL',
'model.apiKey': 'API Key',
'model.default': '(默认)',
'model.notSet': '(未设置)',
'model.footer': 'Enter 选择,↑↓ 导航,Esc 关闭',
'model.searchHint': '按 / 搜索',
'model.fastHint': '用于建议和旁路任务',
'model.noMatch': (v) => `没有匹配 "${v?.query ?? ''}" 的模型`,
'model.unavailable': '模型列表暂不可用,将使用守护进程默认模型。',
'model.none': '没有可用模型',
'model.select': '选择模型',
'model.section': '模型',
'reasoning.options': '选项',
'reasoning.thinking': '思考',
'reasoning.thinkingOff': '思考已关闭',
'reasoning.effort': '思考强度',
'reasoning.effort.low': '低',
'reasoning.effort.medium': '中',
'reasoning.effort.high': '高',
'reasoning.effort.xhigh': '极高',
'reasoning.effort.max': '最高',
'reasoning.updateFailed': '更新思考选项失败',
'model.setFast': '设置 Fast Model',
'model.setVoice': '设置语音模型',
'auth.purpose.label': '模型用途',
'auth.purpose.chat': '对话',
'auth.purpose.chatHint':
'将此提供商用于对话。配置包含当前模型时会保留当前选择。',
'auth.purpose.image': '生图',
'auth.purpose.voice': '语音转写',
'auth.purpose.realtime': '实时语音',
'auth.purpose.imageHint':
'支持 DashScope 或 MiniMax 兼容生图接口,请使用不含查询参数或片段的 HTTPS 地址。添加后保留当前对话模型。',
'auth.purpose.voiceHint':
'请选择 OpenAI Chat Completions API,使用 qwen3-asr-flash、qwen3-asr-flash-realtime、fun-asr-realtime 或 paraformer-realtime 等受支持的转写模型。添加后保留当前对话模型。',
'model.setAdvisor': '设置顾问模型',
'model.setImage': '设置生图模型',
'model.useMain': '使用主模型',
'model.disabled': '不启用',
'model.setVision': '设置视觉模型',
'model.switch': '切换模型',
'model.unknown': '未知',
'resume.current': '当前',
'resume.activePrompt': '正在运行',
'resume.filter': '筛选',
'resume.noMatch': (v) => `没有匹配 "${v?.query ?? ''}" 的会话`,
'resume.none': '没有可恢复的会话',
'resume.pressSearch': '按 / 搜索',
'resume.search': '搜索',
'resume.title': '恢复会话',
'parallelAgents.title': '并行智能体',
'parallelAgents.done': (v) => `${v?.done ?? 0}/${v?.total ?? 0} 完成`,
'parallelAgents.failed': (v) => `失败 ${v?.count ?? 0} 个`,
'skills.actions': 'Skill 操作',
'skills.disable': '禁用',
'skills.disableInWorkspace': '在此工作区禁用',
'skills.disabled': 'Skill 已禁用。',
'skills.enable': '启用',
'skills.enabled': 'Skill 已启用。',
'skills.install.action': '上传',
'skills.install.description': '从 GitHub、本地文件夹或 ZIP 压缩包安装技能。',
'skills.install.error.authentication': '上传技能需要身份认证。',
'skills.install.error.folderRequired': '请输入文件夹路径。',
'skills.install.error.githubRequired': '请输入 GitHub SKILL.md 地址。',
'skills.install.error.invalidName': '技能名称缺失或包含不支持的字符。',
'skills.install.error.manifestMissing':
'技能包根目录中必须包含 SKILL.md 文件。',
'skills.install.error.invalidPackage':
'技能包无效,请检查目录结构和 SKILL.md 内容。',
'skills.install.error.zipTooLarge': 'ZIP 文件不能超过 6 MB。',
'skills.install.error.invalidFolder': '请输入有效的本地技能文件夹路径。',
'skills.install.error.githubFailed':
'无法从 GitHub 下载技能,请检查地址或认证信息后重试。',
'skills.install.error.invalidScope': '请选择工作区或全局安装位置。',
'skills.install.error.invalidSource':
'当前 daemon 无法识别这种上传来源,请重启已更新的 daemon 后重试。',
'skills.install.error.notFound': '未找到指定的技能。',
'skills.install.error.nameRequired': '请输入技能名称。',
'skills.install.error.untrusted': '请先信任当前工作区,再上传技能。',
'skills.install.failed': '上传技能失败。',
'skills.install.folder': '本地文件夹',
'skills.install.folderPath': '文件夹路径',
'skills.install.githubUrl': 'SKILL.md 地址',
'skills.install.name': '技能名称',
'skills.install.scope': '安装位置',
'skills.install.scope.global': '全局',
'skills.install.scope.workspace': '工作区',
'skills.install.selectZip': '请选择 ZIP 压缩包。',
'skills.install.title': '上传技能',
'skills.install.succeeded': (v) => `技能“${v?.name ?? ''}”上传成功。`,
'skills.install.zipSelected': (v) => `已选择:${v?.name ?? ''}`,
'skills.delete.action': '删除技能',
'skills.delete.description': (v) =>
`确定从磁盘删除“${v?.name ?? ''}”吗?此操作无法撤销。`,
'skills.delete.failed': '删除技能失败。',
'skills.delete.succeeded': (v) => `技能“${v?.name ?? ''}”删除成功。`,
'skills.delete.title': '删除技能?',
'skills.empty': '没有可用 skill。',
'skills.count': (v) =>
[
`${v?.count ?? 0} 个技能`,
...(v?.enabled ? [`已启用 ${v.enabled} 个`] : []),
...(v?.disabled ? [`已禁用 ${v.disabled} 个`] : []),
].join(','),
'skills.details': 'Skill 详情',
'skills.extension': '所属扩展',
'skills.filter.all': '全部',
'skills.filter.bundled': '内置',
'skills.filter.extension': '扩展',
'skills.filter.label': '按来源筛选 Skills',
'skills.filter.project': '工作区设置',
'skills.filter.status.all': '全部',
'skills.filter.status.disabled': '已禁用',
'skills.filter.status.enabled': '已启用',
'skills.filter.status.label': '按状态筛选技能',
'skills.filter.user': '全局设置',
'skills.hint': '提示',
'skills.invocation': '调用方式',
'skills.level': '作用域',
'skills.level.bundled': '内置',
'skills.level.extension': '扩展',
'skills.level.project': '项目',
'skills.level.user': '全局',
'skills.loading': '正在加载 skills...',
'skills.manualReference': '手动引用',
'skills.manualReferenceHint': '模型无法自动识别,需手动引用 skill',
'skills.model': '模型',
'skills.modelAccess': '模型调用',
'skills.modelAccess.disabled': '不可由模型调用',
'skills.modelAccess.enabled': '可由模型调用',
'skills.modelInvocable': '模型可用',
'skills.noDescription': '暂无描述',
'skills.noMatches': '没有匹配的 Skill。',
'skills.notToggleable': '此 Skill 不支持启用或禁用。',
'skills.run': '引用 skill',
'skills.search': '搜索 Skills…',
'skills.settingUpdated': 'Workspace 设置已更新。',
'skills.settingUpdatedAvailabilityUnchanged':
'Workspace 设置已更新,Skill 的实际可用状态未改变。',
'skills.settingUnchanged': 'Skill 已处于请求的 Workspace 设置,无需更改。',
'skills.status': '状态',
'skills.status.disabled': '已禁用',
'skills.status.enabled': '已启用',
'skills.toggleFailed': '更新 Skill 失败。',
'skills.error.inactiveExtension':
'该技能所属扩展当前未启用,请先启用对应扩展。',
'skills.toggleUnsupported': '当前连接的 daemon 不支持启用或禁用 Skill。',
'skills.title': 'Skills',
'plugins.extensions': '扩展',
'plugins.agents': '智能体',
'plugins.mcp': 'MCP',
'plugins.sections': '插件分类',
'plugins.skills': '技能',
'plugins.title': '插件',
'plugins.tools': '工具',
'stats.accepted': '已接受:',
'stats.agreementRate': '总体同意率:',
'stats.api': 'API',
'stats.apiTime': 'API 耗时',
'stats.avgDuration': '平均耗时',
'stats.avgLatency': '平均延迟',
'stats.cached': '缓存',
'stats.cacheDesc': '的输入 Token 来自缓存,降低了成本。',
'stats.calls': '调用次数',
'stats.codeChanges': '代码变更',
'stats.decisionSummary': '用户决策摘要',
'stats.duration': '时长',
'stats.errors': '错误数',
'stats.inputTokens': '输入 Token',
'stats.metric': '指标',
'stats.modelStats': '模型统计(技术细节)',
'stats.modelTip': '提示:运行 /stats model 查看完整 Token 明细。',
'stats.modelUsage': '模型使用',
'stats.modified': '已修改:',
'stats.noApiCalls': '本次会话暂无 API 调用。',
'stats.noToolCalls': '本次会话暂无工具调用。',
'stats.outputTokens': '输出 Token',
'stats.overview': '会话概览',
'stats.performance': '性能',
'stats.prompts': '对话轮次',
'stats.rejected': '已拒绝:',
'stats.reqs': '请求',
'stats.requests': '请求数',
'stats.savingsHighlight': '节省亮点:',
'stats.successRate': '成功率',
'stats.thoughts': '思考',
'stats.title': '会话统计',
'stats.tokens': 'Token',
'stats.toolCalls': '工具调用',
'stats.toolName': '工具名称',
'stats.toolStats': '工具统计(技术细节)',
'stats.toolTime': '工具耗时',
'stats.total': '总计',
'stats.totalReviewed': '已审核建议总数:',
'contextUsage.refresh': '刷新',
'contextUsage.remaining': '剩余',
'contextUsage.advanced': '高级 · 用量分类',
'contextUsage.snapshot': '历史快照',
'contextUsage.viewCurrent': '查看当前上下文',
'contextUsage.compress': '手动压缩',
'contextUsage.compressing': '正在压缩…',
'contextUsage.compressed': '压缩完成,已刷新上下文用量。',
'contextUsage.compressCancelled': '已请求取消压缩,请刷新确认当前用量。',
'contextUsage.compressInterrupted':
'压缩期间连接发生变化,请刷新查看当前使用量。',
'contextUsage.compressFailed': '压缩失败,可以重试。',
'contextUsage.compressRefreshFailed':
'压缩已完成,但用量刷新失败。请点击刷新重试。',
'contextUsage.compressUnavailable':
'会话连接正常、空闲、可写、没有活动目标且支持内置压缩命令时可用。',
'contextCompression.result': (v) =>
`上下文已压缩 ${v?.from ?? ''} → ${v?.to ?? ''}`,
'contextCompression.instructionsTruncated': (v) =>
`压缩指令已截断为 ${v?.max ?? ''} 个字符。`,
'contextCompression.noop': '无需压缩。',
'contextUsage.retry': '重试',
'contextUsage.loadError': '上下文使用情况加载失败。',
'contextUsage.previousReading': '刷新失败,当前显示先前读数。',
'contextUsage.unavailable': '当前会话无法读取上下文使用情况。',
'tokenUsage.avgLatency': '平均延迟',
'tokenUsage.cached': '缓存输入',
'tokenUsage.input': '输入',
'tokenUsage.loadError': 'Token 消耗加载失败。',
'tokenUsage.models': '按模型',
'tokenUsage.noData': '本会话还没有 API 调用。',
'tokenUsage.noSubagents': '本会话还没有子 agent 调用。',
'tokenUsage.noTools': '本会话还没有工具调用。',
'tokenUsage.open': '会话 Token 消耗',
'tokenUsage.output': '总输出',
'tokenUsage.refresh': '刷新',
'tokenUsage.requests': '请求',
'tokenUsage.retry': '重试',
'tokenUsage.subagents': '子agent',
'tokenUsage.thoughts': '思考(包含在总输出中)',
'tokenUsage.title': 'Token 消耗',
'tokenUsage.toolRow': (v) =>
`${v?.count ?? 0} 次 · 成功率 ${v?.rate ?? 0}% · ${v?.duration ?? ''}`,
'tokenUsage.tools': '工具',
'tokenUsage.updatedAt': (v) => `更新于 ${v?.time ?? ''}`,
'tokenUsage.unavailable': '当前会话无法读取 Token 消耗。',
'trajectory.title': '轨迹',
'trajectory.description': '查看这次运行把时间和 token 花在了哪里',
'trajectory.empty': '这个会话还没有记录。',
'trajectory.noTiming': '这些记录没有请求或工具的耗时数据。',
'trajectory.truncated': '只显示最近的记录,更早的历史没有加载。',
'trajectory.loadingPages': (v) => `正在读取记录…(已 ${v?.pages ?? 0} 页)`,
'trajectory.olderFailed': (v) => `更早的记录没有读到:${v?.message ?? ''}`,
'trajectory.olderPartial': '更早的记录只读到一部分,所以没有显示。',
'trajectory.loadFailed': (v) => `读取会话记录失败:${v?.message ?? ''}`,
'trajectory.partial': '这份会话记录有一部分读不出来,缺少了一些记录。',
'trajectory.totals': (v) =>
`已加载窗口 · ${v?.turns ?? 0} 轮 · ${v?.requests ?? 0} 请求 · ${v?.tools ?? 0} 工具`,
'trajectory.turn': (v) => `第 ${v?.index ?? 0} 轮`,
'trajectory.turnPartial': (v) => `第 ${v?.index ?? 0} 轮(接上文)`,
'trajectory.turnSummary': (v) =>
`${v?.requests ?? 0} 次请求 · ${v?.tools ?? 0} 次工具 · 主模型累计 ${v?.duration ?? ''}`,
'trajectory.request': '模型请求',
'trajectory.requestFailed': '请求失败',
'trajectory.toolFailed': '工具失败',
'trajectory.ttft': (v) => `首 token ${v?.duration ?? ''}`,
'trajectory.subagentRollup': (v) =>
`子代理 ${v?.requests ?? 0} 次请求 · ${v?.tools ?? 0} 次工具 · ${v?.duration ?? ''}`,
'trajectory.badge.user': '用户',
'trajectory.badge.message': '回复',
'trajectory.badge.thought': '思考',
'trajectory.badge.tool': '工具',
'trajectory.badge.subagent': '子代理',
'trajectory.badge.shell': '终端',
'trajectory.badge.permission': '询问',
'trajectory.badge.status': '提示',
'trajectory.badge.cancelled': '中断',
'trajectory.badge.other': '其他',
'trajectory.cancelled': '本轮已取消',
'trajectory.overview.label': (v) =>
`时间轴:${v?.spans ?? 0} 条有计时的记录,活跃 ${v?.busy ?? ''}`,
'trajectory.overview.busy': (v) => `活跃 ${v?.duration ?? ''}`,
'trajectory.range.status': (v) =>
`当前可见记录 ${v?.shown ?? 0} / 窗口记录 ${v?.total ?? 0}(含上下文)`,
'trajectory.collapsed': (v) => `已折叠 ${v?.count ?? 0} 条记录`,
'trajectory.expand': (v) => `展开${v?.name ?? ''}`,
'trajectory.collapse': (v) => `折叠${v?.name ?? ''}`,
'trajectory.parentUnresolved': '父调用未定位',
'trajectory.contextRow': '上下文',
'trajectory.inspector.hiddenByCollapse': '记录所在分组已折叠。',
'trajectory.reveal': '展开并定位',
'trajectory.range.clear': '清除时间区间',
'trajectory.range.empty': '所选区间内没有请求或工具运行。',
'trajectory.mode.clock': '真实时间(含空闲)',
'trajectory.clock.window': (v) =>
`历时 ${v?.elapsed ?? ''},活跃 ${v?.active ?? ''}`,
'trajectory.clock.label': (v) =>
`${v?.spans ?? 0} 条计时记录,历时 ${v?.elapsed ?? ''},活跃 ${v?.active ?? ''}`,
'trajectory.clock.status': '已切换为真实时间,含空闲',
'trajectory.active.status': '已切换为只看活跃时间',
'trajectory.zoom.in': '放大',
'trajectory.zoom.out': '缩小',
'trajectory.zoom.reset': '显示整段',
'trajectory.zoom.window': (v) => `${v?.to ?? ''} / ${v?.busy ?? ''}`,
'trajectory.zoom.aria': (v) => `,已放大到 ${v?.from ?? ''}–${v?.to ?? ''}`,
'trajectory.zoom.status': (v) =>
`显示 ${v?.from ?? ''}–${v?.to ?? ''},共 ${v?.busy ?? ''}`,
'trajectory.range.aria': (v) => `,已选 ${v?.from ?? ''} 到 ${v?.to ?? ''}`,
'trajectory.metric.elapsed': '执行跨度',
'trajectory.metric.active': '活跃覆盖',
'trajectory.metric.main': '主模型请求累计',
'trajectory.metric.help': '指标说明',
'trajectory.metric.scope':
'计数针对已加载窗口内投影后的记录,包含已加载的子代理记录;时间框选和缩放不改变总计。',
'trajectory.metric.elapsed.help':
'执行跨度:已记录开始到结束的跨度,含间隔;仅覆盖可绘制记录。',
'trajectory.metric.active.help':
'活跃覆盖:至少一个已记录请求或工具处于执行中的时间,并行部分只计一次。',
'trajectory.metric.main.help':
'主模型请求累计:主会话模型请求耗时之和,不含子代理请求和工具;可能包含失败尝试。',
'trajectory.metric.missing.help':
'未绘制的请求和工具仍保留在列表。破折号表示未记录,零表示真实零值。',
'trajectory.failures': (v) =>
`失败请求 ${v?.requests ?? 0} · 失败工具 ${v?.tools ?? 0}`,
'trajectory.unrecorded': '未记录',
'trajectory.unplotted': (v) =>
`未绘制:有耗时无起点 ${v?.starts ?? 0} 条 · 无耗时 ${v?.timing ?? 0} 条`,
'trajectory.missingStart': (v) => `${v?.count ?? 0} 条有耗时记录缺少起点`,
'trajectory.missingTiming': (v) => `${v?.count ?? 0} 条工具记录无耗时`,
'trajectory.noStart': '已记录耗时,但均无起点,无法绘制条带。',
'trajectory.refreshStale': '刷新失败,当前为上次成功读取的数据',
'trajectory.selected.label': '所选',
'trajectory.selected.none': '请选择一条记录',
'trajectory.selected.noTiming': '无请求或工具计时',
'trajectory.inspector.title': '记录详情',
'trajectory.inspector.open': '查看详情',
'trajectory.inspector.close': '关闭详情',
'trajectory.inspector.selectRecord': '请选择一条记录查看。',
'trajectory.inspector.selectRowInTurn': '已选择轮次,请选择一条记录查看。',
'trajectory.inspector.stale': '记录窗口已更新,请重新选择记录。',
'trajectory.inspector.hiddenByRange': '此记录不在所选时间内。',
'trajectory.inspector.tab.summary': '摘要',
'trajectory.inspector.tab.input': '输入',
'trajectory.inspector.tab.output': '输出',
'trajectory.inspector.tab.metrics': '指标',
'trajectory.inspector.tab.body': '正文',
'trajectory.inspector.model': '模型',
'trajectory.inspector.status': '状态',
'trajectory.inspector.permissionTitle': '标题',
'trajectory.inspector.permissionPending': '等待处理',
'trajectory.inspector.executionId': '执行 ID',
'trajectory.inspector.responseId': '响应 ID',
'trajectory.inspector.promptId': '提示 ID',
'trajectory.inspector.subagent': '子代理',
'trajectory.inspector.parentCall': '父调用 ID',
'trajectory.inspector.duration': '耗时',
'trajectory.inspector.start': '记录起点',
'trajectory.inspector.end': '推算结束',
'trajectory.inspector.ttft': '首 token',
'trajectory.inspector.afterFirst': '首 token 后耗时',
'trajectory.inspector.invalidTtft': '记录的首 token 时间与总耗时不一致',
'trajectory.inspector.inputTokens': '输入 token',
'trajectory.inspector.outputTokens': '输出 token',
'trajectory.inspector.cachedTokens': '缓存输入 token(包含在输入中)',
'trajectory.inspector.tool': '工具',
'trajectory.inspector.callId': '调用 ID',
'trajectory.inspector.details': '记录详情',
'trajectory.inspector.preview': '记录预览',
'trajectory.inspector.input': '记录输入',
'trajectory.inspector.output': '记录输出',
'trajectory.inspector.contentFallback': '工具内容(无独立原始输出)',
'trajectory.inspector.body': '记录正文',
'trajectory.inspector.kind': '类型',
'trajectory.inspector.images': '图片类型',
'trajectory.inspector.files': '文件',
'trajectory.inspector.resourceLinks': '附件引用',
'trajectory.inspector.command': '命令',
'trajectory.inspector.reason': '原因',
'trajectory.inspector.truncated': '内容已截断',
'trajectory.inspector.formatFailed': '无法格式化这项记录',
'trajectory.inspector.expand': '展开更多',
'trajectory.inspector.copy': '复制显示内容',
'trajectory.inspector.copied': '已复制显示内容',
'trajectory.inspector.copyFailed': '无法复制内容',
'trajectory.mode.group': '时间模式',
'trajectory.mode.active': '活跃时间,去除间隔',
'trajectory.mode.active.short': '活跃时间',
'trajectory.mode.clock.short': '真实时间',
'trajectory.legend.ttft': '主模型:首 token 等待',
'trajectory.legend.after': '首 token 后耗时',
'trajectory.legend.error': '失败',
'trajectory.overview.lane.requests': '模型请求',
'trajectory.overview.lane.tools': '工具调用',
'trajectory.overview.lane.subagents': '子代理请求',
'status.contextUsed': (v) => `上下文已用 ${v?.pct ?? '0.0'}%`,
'status.disconnected': '断开连接',
'status.modeHint': '(shift + tab 或点击切换)',
'status.shortcuts': '? 查看快捷键',
'stream.cancel': 'esc 取消',
'stream.cancelArmed': '再按一次 Esc 停止',
'stream.tokens': (v) => `${v?.count ?? 0} tokens`,
'theme.current': (v) => `当前:${v?.theme ?? ''}`,
'theme.auto': '自动',
'theme.dark': '暗色',
'theme.dark.desc': '仿终端暗色皮肤。',
'theme.light': '亮色',
'theme.light.desc': '仿终端亮色皮肤。',
'theme.title': '主题',
'todo.allDone': '任务已全部完成',
'todo.collapse': '折叠任务列表',
'todo.completedAbove': (v) => `✓ 已完成 ${v?.count ?? 0} 项`,
'todo.detail.api': 'API',
'todo.detail.cached': '缓存',
'todo.detail.end': '结束',
'todo.detail.hide': '收起任务明细',
'todo.detail.input': '输入',
'todo.detail.noResources': '未采集到该任务的 Token 与耗时明细。',
'todo.detail.output': '输出',
'todo.detail.sectionSpent': '耗时',
'todo.detail.sectionTime': '时间',
'todo.detail.sectionTokens': 'Token',
'todo.detail.show': '查看任务明细',
'todo.detail.start': '开始',
'todo.detail.tool': '工具',
'todo.expand': '展开任务列表',
'todo.more': (v) => `... 还有 ${v?.count ?? 0} 项`,
'todo.moreAbove': (v) => `... 前面还有 ${v?.count ?? 0} 项`,
'todo.showLess': '收起',
'todo.stepProgress': (v) => `第 ${v?.current ?? 0} / ${v?.total ?? 0} 步`,
'todo.stepFraction': (v) => `${v?.current ?? 0} / ${v?.total ?? 0}`,
'todo.title': '当前任务',
'planExecution.dialogTitle': '计划与任务',
'planExecution.title': '计划执行',
'planExecution.overview': '工作流概况',
'planExecution.overallProgress': '整体进度',
'planExecution.stepsCompleted': '步骤已完成',
'planExecution.activeAgents': 'Agent 正在工作',
'planExecution.needsAttention': '需要关注',
'planExecution.stepDetails': '步骤详情',
'planExecution.subagents': '子智能体',
'planExecution.noSubagents': '该步骤暂未关联 Agent。',
'planExecution.openDetails': '打开子智能体详情',
'planExecution.currentActivity': '当前动作:',
'planExecution.toolCalls': (v) => `${v?.count ?? 0} 次工具调用`,
'planExecution.tokens': (v) => `${v?.count ?? 0} tokens`,
'planExecution.view': '查看计划执行',
'planExecution.dependsOn': '依赖:',
'planExecution.unblocks': '解锁:',
'planExecution.unassigned': '未关联的执行',
'planExecution.attention': '需要关注',
'planExecution.agentCount': (v) => `${v?.count ?? 0} 个 Agent`,
'planExecution.status.running': '运行中',
'planExecution.status.paused': '已暂停',
'planExecution.status.completed': '已完成',
'planExecution.status.blocked': '被阻塞',
'planExecution.status.in_progress': '进行中',
'planExecution.status.ready': '就绪',
'planExecution.edgesHidden': (v) =>
`依赖过多(${v?.count ?? 0} 条),无法绘制连线,已改为在每个步骤上列出。`,
'workflow.chatTitle': '对话',
'workflow.title': '工作流',
'workflow.inspector.summary': '工作流进度',
'workflow.inspector.selectedStep': '当前步骤',
'workflow.inspector.allSteps': '全部步骤',
'workflow.inspector.recentActivity': '最近 Agent 活动',
'workflow.inspector.expandGraph': '展开依赖图',
'workflow.inspector.graphCanvas': '依赖图画布',
'workflow.inspector.canvasHint':
'在图中选择节点,可在这里查看依赖和 Agent 执行。',
'workflow.inspector.activeAgents': (v) => `${v?.count ?? 0} 个运行中的 Agent`,
'workflow.inspector.attentionCount': (v) => `${v?.count ?? 0} 个需要关注`,
'workflow.planReview.title': '计划并审阅',
'workflow.planReview.question': '确认计划并开始协作?',
'workflow.planReview.confirm': '确认并开始',
'workflow.planReview.continuePlanning': '继续完善计划',
'workflow.empty.title': '这个会话还没有结构化工作流',
'workflow.empty.copy':
'返回对话,进入计划并审阅,让模型先写入带稳定 ID 和依赖的待办。',
'workflow.empty.action': '返回对话创建计划',
'workflow.tabs.attention': '待我处理',
'workflow.connection.connected': 'Daemon 已连接',
'workflow.connection.reconnecting': 'Daemon 正在重连',
'workflow.session.defaultTitle': '当前会话工作流',
'workflow.session.workspace': '工作区',
'workflow.dependencies.upstream': '依赖于',
'workflow.dependencies.none': '无',
'workflow.dependencies.unblocks': '解除阻塞',
'workflow.dependencies.noDownstream': '没有下游步骤',
'workflow.activity.empty': '还没有关联到待办的 Agent 执行。',
'workflow.activity.showAll': (v) => `查看全部 ${v?.count ?? 0} 条执行`,
'workflow.deliverables.title': '会话交付物',
'workflow.deliverables.none': '尚未发布产物',
'workflow.status.running': '运行中',
'workflow.status.paused': '已暂停',
'workflow.status.completed': '已完成',
'workflow.status.failed': '失败',
'workflow.status.cancelled': '已取消',
'workflow.task.completed': '已完成',
'workflow.task.attention': '需要关注',
'workflow.task.running': '协作运行中',
'workflow.task.waitingExecution': '等待执行',
'planExecution.locateCurrent': '定位当前步骤',
'status.mode': '审批模式',
'chat.scrollToBottom': '回到底部',
'chatHeader.toggleEnvironment': '切换环境信息',
'chatHeader.toggleRightPanel': '切换右侧扩展区',
'environment.title': '环境信息',
'environment.changes': '变更',
'environment.changeCount': (v) => `${v?.count ?? 0} 项变更`,
'environment.clean': '无变更',
'environment.workspace': '工作区',
'environment.branch': '分支',
'environment.history': '提交历史',
'environment.agents': '子智能体',
'environment.unnamedAgent': (v) => `智能体(${v?.index ?? 0})`,
'workflow.open': '打开智能体工作流',
'workflow.mainAgent': '主智能体',
'workflow.empty': '此工作流中暂无子智能体',
'workflow.loadFailed': '工作流加载失败',
'environment.unavailable': '不可用',
'sources.title': '来源',
'sources.count': (v) => `${v?.count ?? 0} 个来源`,
'sources.currentTurn': '本轮来源',
'sources.add': '添加来源',
'sources.empty': '添加文件或链接作为参考。',
'sources.explanation': '添加引用不会将内容发送给助手。',
'sources.remove': '移除来源',
'sources.open': '打开来源',
'sources.viewAll': '查看全部',
'sources.type': '引用类型',
'sources.workspaceFile': '工作区文件',
'sources.link': '链接',
'sources.location': '路径或链接',
'sources.name': '标题(可选)',
'sources.description': '描述(可选)',
'sources.registrationFailed': '消息已发送;部分来源信息未能保存',
'sources.attachmentsLoadFailed': (v) =>
`上传文件加载失败:${v?.error ?? '未知错误'}`,
'sources.openOriginal': '打开原链接',
'sources.unavailable': '此引用在当前工作区中不可用。',
'environment.attachments': '附件',
'environment.artifacts': '产物',
'environment.artifactsEmpty': '此会话生成的产物会显示在这里。',
'rightPanel.attachmentLoadFailed': (v) =>
`附件加载失败:${v?.error ?? '未知错误'}`,
'rightPanel.savedContentUnavailable': '保存的面板内容已不可用',
'rightPanel.restoreFailed': (v) => `面板恢复失败:${v?.error ?? '未知错误'}`,
'userMessage.showMore': '显示更多',
'userMessage.showLess': '收起',
'userMessage.sendFailed': '发送失败',
'userMessage.retrySend': '重新发送消息',
'userMessage.edit': '编辑消息',
'userMessage.editSubmit': '发送',
'userMessage.editSending': '发送中…',
'userMessage.editBusy': '请先等待当前轮次结束再编辑。',
'userMessage.editStale': '消息已发生变化,请重新打开编辑器后再试。',
'userMessage.editAttachmentUnavailable': '附件内容不可用,消息尚未回退。',
'userMessage.editSyncFailed':
'无法确认回退已同步。编辑内容已暂存,正在等待同步。',
'userMessage.editFailed': (v) => `无法重发编辑的消息:${v?.reason ?? ''}`,
'turn.processed': '已处理',
'turn.processing': '处理中',
'turn.collapse': '折叠步骤',
'turn.expand': '展开步骤',
'turn.cached': '缓存',
'turn.executionSteps': (v) => `${v?.count ?? 0} 步`,
'turn.toolCalls': (v) => `工具 ${v?.count ?? 0} 次`,
'turn.thinkingCount': (v) => `思考 ${v?.count ?? 0} 次`,
'turn.stopped': '你已取消请求',
'turn.stoppedAfter': (v) => `你在 ${v?.seconds ?? 0} 秒后取消了请求`,
'message.renderError': '此消息无法显示。',
'tasks.title': '后台任务',
'tasks.empty': '当前没有运行中的任务',
'tasks.refreshStale': '任务状态可能已过期,正在重连...',
'tasks.cancelFailed': '取消任务失败',
'tasks.alreadyStopped': '任务已停止',
'tasks.moreAbove': (v) => `^ 上方还有 ${v?.count ?? 0} 个`,
'tasks.moreBelow': (v) => `v 下方还有 ${v?.count ?? 0} 个`,
'tasks.running': '运行中',
'tasks.pausing': '暂停中',
'tasks.completed': '已完成',
'tasks.failed': '失败',
'tasks.cancelled': '已停止',
'tasks.paused': '已暂停',
'tasks.kind.shell': 'Shell',
'tasks.kind.monitor': '监控',
'tasks.kind.workflow': '工作流',
'workflow.graph.waiting': '等待第一个 Agent 调度…',
'workflow.graph.notRecorded': '这次运行没有保存执行图。',
'workflow.inline.loading': '正在加载 Workflow 实时执行状态…',
'workflow.inline.unavailable': '当前会话中已无法读取这次 Workflow 运行。',
'workflow.graph.omitted': (v) =>
`为保证性能,执行图已省略 ${v?.lanes ?? 0} 个阶段、${v?.nodes ?? 0} 个 Agent 和 ${v?.edges ?? 0} 条连线。`,
'workflow.noPhase': '未分阶段',
'workflow.dispatchCount': (v) => `${v?.count ?? 0} 个调度`,
'workflow.selectedDispatch': '已选调度',
'workflow.dependencies': '依赖',
'workflow.action.pause': '暂停',
'workflow.action.resume': '继续',
'workflow.action.retry': '重试失败路径',
'workflow.action.rerun': '全部重跑',
'workflow.action.unavailable': '操作前工作流状态已发生变化。',
'workflow.action.argsUnavailable': '无法重启:历史里没有它启动时用的参数。',
'workflow.action.failed': '无法更新工作流状态。',
'workflow.history.retry': (v) => `从 ${v?.runId ?? ''} 续跑`,
'workflow.history.rerun': (v) => `从 ${v?.runId ?? ''} 全部重跑`,
'workflow.history.cached': (v) => `${v?.count ?? 0} 个缓存命中`,
'workflow.history.saved': (v) => `已保存 ${v?.count ?? 0} 次运行`,
'workflow.history.restored': '已保存运行',
'workflow.history.showRuns': (v) => `运行历史(${v?.count ?? 0})`,
'workflow.history.hideRuns': '收起历史',
'workflow.history.filter': '筛选运行',
'workflow.history.filterAll': '全部状态',
'workflow.history.visibleCount': (v) => `${v?.count ?? 0} / ${v?.total ?? 0}`,
'workflow.history.filterEmpty': '没有符合当前筛选条件的历史运行。',
'workflow.history.exportVisible': '导出当前结果',
'workflow.history.delete': '删除',
'workflow.history.deleteSaved': '删除已保存运行',
'workflow.history.confirmDelete': '确认删除',
'workflow.history.deleteUnavailable': '这次历史运行已不存在。',
'workflow.history.deleteFailed': '无法删除这次历史运行。',
'workflow.history.compareRun': (v) => `对比运行 ${v?.runId ?? ''}`,
'workflow.history.compare': '对比两次运行',
'workflow.history.hideComparison': '收起对比',
'workflow.history.source': '来源运行',
'workflow.history.compared': '对比运行',
'workflow.history.current': '当前运行',
'workflow.history.status': '状态',
'workflow.history.agents': 'Agents',
'workflow.approvalNeeded': '等待审批',
'workflow.respondInChat': '请在对话中处理',
'workflow.metric.agents': 'Agents',
'workflow.metric.running': '运行中',
'workflow.metric.queued': '排队中',
'workflow.metric.tokens': 'Tokens',
'workflow.dispatch.queued': '排队中',
'workflow.dispatch.running': '运行中',
'workflow.dispatch.completed': '已完成',
'workflow.dispatch.failed': '失败',
'workflow.dispatch.cancelled': '已取消',
'workflow.dispatch.cached': '已缓存',
'tasks.action.stop': '停止',
'tasks.action.abandon': '放弃',
'tasks.action.confirmStop': '确认停止',
'tasks.action.confirmAbandon': '确认放弃',
'tasks.action.confirmHint': '这会终结当前阻塞轮次。',
'tasks.pill.agent': (v) => `${v?.count ?? 0} 个本地智能体`,
'tasks.pill.agents': (v) => `${v?.count ?? 0} 个本地智能体`,
'tasks.pill.agentPaused': (v) => `${v?.count ?? 0} 个本地智能体已暂停`,
'tasks.pill.agentsPaused': (v) => `${v?.count ?? 0} 个本地智能体已暂停`,
'tasks.pill.done': (v) => `${v?.count ?? 0} 个任务完成`,
'tasks.pill.doneMany': (v) => `${v?.count ?? 0} 个任务完成`,
'tasks.pill.monitor': (v) => `${v?.count ?? 0} 个监控`,
'tasks.pill.monitors': (v) => `${v?.count ?? 0} 个监控`,
'tasks.pill.shell': (v) => `${v?.count ?? 0} 个 shell`,
'tasks.pill.shells': (v) => `${v?.count ?? 0} 个 shell`,
'tasks.pill.workflow': (v) => `${v?.count ?? 0} 个工作流`,
'tasks.pill.workflows': (v) => `${v?.count ?? 0} 个工作流`,
'tasks.confirmStop': '再按 x 确认停止 · 会终结当前阻塞轮次',
'tasks.shortcut.select': '↑/↓ 选择',
'tasks.shortcut.view': 'Enter 查看',
'tasks.shortcut.stop': 'x 停止',
'tasks.shortcut.abandon': 'x 放弃',
'tasks.shortcut.listClose': '←/Esc 关闭',
'tasks.shortcut.detailBack': '← 返回',
'tasks.shortcut.detailClose': 'Esc/Enter/Space 关闭',
'tasks.shortcut.close': 'Esc 关闭',
'tasks.shortcut.cancelConfirm': 'Esc 取消',
'tasks.detail.workingDir': '工作目录',
'tasks.detail.outputFile': '输出文件',
'tasks.detail.command': '命令',
'tasks.detail.events': (v) => `${v?.count ?? 0} 个事件`,
'tasks.detail.exit': (v) => `退出码 ${v?.exitCode ?? ''}`,
'tasks.detail.dropped': (v) => `${v?.count ?? 0} 个已丢弃`,
'tasks.detail.error': '错误',
'tasks.detail.stoppedBecause': '停止原因',
'tasks.detail.resumeBlocked': '恢复被阻止',
'tasks.detail.progress': '执行进度',
'tasks.detail.prompt': '提示词',
'tasks.detail.type': '类型',
'tasks.detail.runtime': '时间',
'tasks.detail.eventCount': '事件数',
'tasks.detail.pid': 'PID',
'tasks.detail.lastEvent': '最近事件',
'tasks.detail.droppedCount': '丢弃行数',
'tasks.detail.exitCode': '退出码',
'tasks.detail.tokenCount': 'Tokens',
'tasks.detail.toolCallCount': '工具数量',
'tasks.detail.tokens': (v) => `${v?.count ?? 0} tokens`,
'tasks.detail.toolCalls': (v) => `${v?.count ?? 0} 次工具调用`,
'tasks.detail.nesting': '嵌套',
'tasks.detail.nestingValue': (v) =>
`第 ${v?.level ?? '?'} 层 · 来自 ${v?.parent ?? '?'}`,
'tasks.detail.nestingLevel': (v) => `第 ${v?.level ?? '?'} 层`,
'tasks.row.from': (v) => `来自 ${v?.parent ?? '?'}`,
'tasks.row.nested': '嵌套',
'tips.items':
'输入 / 查看所有可用命令。|使用 @ 引用文件路径。|按 Esc 取消正在进行的请求。|使用 Shift+Enter 换行。|按 ↑↓ 浏览历史消息。',
'tools.available': '可用工具:',
'tools.none': '没有可用工具。',
'tools.empty': '没有可用的内置工具。请先打开一个会话。',
'tools.footer': (v) =>
v?.name
? `${v?.details ? 'Enter/Space 查看详情 · ' : ''}t 切换 ${v.name} · r 刷新 · Esc 关闭`
: 'r 刷新 · Esc 关闭',
'tools.details.hide': '收起详情',
'tools.details.show': '展开详情',
'tools.description': '描述',
'tools.details': '工具详情',
'tools.loading': '正在加载工具...',
'tools.name': '工具名称',
'tools.noDescription': '暂无描述',
'tools.noMatches': '没有匹配的工具。',
'tools.search': '搜索工具…',
'tools.status': '状态',
'tools.status.disabled': '已禁用',
'tools.status.enabled': '已启用',
'tools.summary': (v) => `${v?.enabled ?? 0}/${v?.total ?? 0} 已启用`,
'tools.title': '工具',
'tools.update.disable': '禁用',
'tools.update.enable': '启用',
'tools.updating': '更新中...',
'tool.collapse': '▲ 收起',
'tool.expand': '展开',
'tool.viewFile': '查看文件',
'tool.viewImage': '查看图片',
'tool.viewCurrentFile': '查看当前文件',
'tool.collapseHint': '收起',
'tool.status.failed': '执行失败',
'toolGroup.moreKinds': (v) => ` +${v?.count ?? 0}`,
'toolGroup.summary': (v) => `调用了 ${v?.count ?? 0} 个工具`,
'toolGroup.summary.ranAgents': (v) => `已运行 ${v?.count ?? 0} 个智能体`,
'toolGroup.summary.editedFiles': (v) => `已编辑文件 ${v?.count ?? 0} 次`,
'toolGroup.summary.ranCommands': (v) => `已运行 ${v?.count ?? 0} 条命令`,
'toolGroup.summary.readFiles': (v) => `已读取文件 ${v?.count ?? 0} 次`,
'toolGroup.summary.searched': (v) => `已搜索 ${v?.count ?? 0} 次`,
'toolGroup.summary.updatedTodos': (v) =>
Number(v?.count ?? 0) > 1
? `已更新任务清单 ${v?.count ?? 0} 次`
: '已更新任务清单',
'toolGroup.summary.provideInformation': '补充信息',
'toolGroup.summary.askedQuestions': (v) => `已询问 ${v?.count ?? 0} 个问题`,
'toolGroup.summary.otherTools': (v) => `调用了 ${v?.count ?? 0} 个工具`,
'toolGroup.running': (v) =>
Number(v?.count ?? 0) > 1
? `正在执行 ${v?.count ?? 0} 个工具:${v?.name ?? '工具'}`
: `正在执行 ${v?.name ?? '工具'}`,
'toolGroup.runningPrefix': '正在执行',
'thinking.expand': '展开思考',
'thinking.collapse': '收起思考',
'thinking.running': (v) => `正在思考${v?.duration ? ` ${v.duration}` : ''}`,
'thinking.doneBriefly': '思考片刻',
'thinking.done': (v) => (v?.duration ? `已思考 ${v.duration}` : '思考完成'),
'thinking.translate': '翻译',
'thinking.translation': '思考翻译',
'thinking.translating': '正在翻译…',
'thinking.translationThinking': '思考中…',
'thinking.translationFailed': '翻译失败',
'thinking.retranslate': '重新翻译',
'thinking.cancelTranslation': '取消',
'thinking.closeTranslation': '关闭',
'thinking.inputTokens': (v) => `发送 Token:${v?.count ?? '--'}`,
'thinking.outputTokens': (v) => `生成 Token:${v?.count ?? '--'}`,
'welcome.changeModel': '(/model 切换)',
'welcome.defaultModel': '未知模型',
'sessionsOverview.current': '当前',
'sessionsOverview.empty': '暂无会话',
'sessionsOverview.loadFailed': '加载会话失败',
'sessionsOverview.loading': '正在加载会话…',
'sessionsOverview.noData': '暂无数据',
'sessionsOverview.openInSplit': '分屏打开',
'sessionsOverview.openInSplitHint': '在本窗口内并排显示选中的会话',
'sessionsOverview.splitLimit': (v) =>
`最多选择 ${v?.max ?? 6} 个会话同时打开`,
'sessionsOverview.openInTab': '新标签页打开',
'sessionsOverview.openInTabHint': '在新标签页中以分屏并排打开选中的会话',
'sessionsOverview.popupBlocked':
'弹出窗口被拦截。请允许本站弹窗,以便在新标签页中打开会话。',
'sessionsOverview.refresh': '刷新',
'sessionsOverview.selectAll': '全选',
'sessionsOverview.titleColumn': '标题',
'sessionsOverview.actions': '操作',
'sessionsOverview.time': '时间',
'sessionsOverview.selectedRows': (v) =>
`${v?.count ?? 0} / ${v?.total ?? 0} 行已选`,
'sessionsOverview.previousPage': '上一页',
'sessionsOverview.nextPage': '下一页',
'sessionsOverview.pageInfo': (v) =>
`第 ${v?.page ?? 0} / ${v?.total ?? 0} 页`,
'sessionsOverview.rowsPerPage': '每页行数',
'sessionsOverview.workspaceFilter': '按工作区筛选',
'sessionsOverview.allWorkspaces': '全部',
'sessionsOverview.searchPlaceholder': '搜索标题、分支、PR 或 ID…',
'sessionsOverview.workspaceAll': '全部工作区',
'sessionsOverview.workspacesSelected': (v) =>
`${v?.count ?? 0}/${v?.total ?? 0} 个工作区`,
'sessionsOverview.statusColumn': '状态',
'sessionsOverview.statusFilter': '按会话状态筛选',
'sessionsOverview.filter.all': '全部',
'sessionsOverview.filter.attention': '待处理',
'sessionsOverview.filter.running': '运行中',
'sessionsOverview.filter.idle': '空闲',
'sessionsOverview.status.idle': '空闲',
'sessionsOverview.details': (v) => `${v?.name ?? ''}的详情`,
'sessionsOverview.sessionCount': (v) => `${v?.total ?? 0} 个会话`,
'sessionsOverview.confirmArchiveTitle': '归档会话?',
'sessionsOverview.confirmArchive': (v) =>
`“${v?.name ?? ''}” 将移至已归档会话。`,
'sessionsOverview.confirmArchiveBulkTitle': (v) =>
`归档 ${v?.count ?? 0} 个会话?`,
'sessionsOverview.confirmArchiveBulk': (v) =>
`选中的 ${v?.count ?? 0} 个会话将移至已归档会话。`,
'sessionsOverview.confirmDeleteTitle': '删除会话?',
'sessionsOverview.confirmDelete': (v) =>
`"${v?.name ?? ''}" 及其对话记录将被永久删除,此操作无法撤销。`,
'sessionsOverview.deleteFailed': '删除会话失败',
'sessionsOverview.archiveFailed': '归档会话失败',
'sessionsOverview.actionUnavailable': '所选会话或工作区不支持此操作',
'sessionsOverview.bulkArchive': '归档',
'sessionsOverview.bulkArchiveHint': (v) =>
`归档选中的 ${v?.count ?? 0} 个会话`,
'sessionsOverview.bulkDelete': '删除',
'sessionsOverview.bulkDeleteHint': (v) =>
`删除选中的 ${v?.count ?? 0} 个会话`,
'sessionsOverview.confirmDeleteBulkTitle': (v) =>
`删除 ${v?.count ?? 0} 个会话?`,
'sessionsOverview.confirmDeleteBulk': (v) =>
`选中的 ${v?.count ?? 0} 个会话及其对话记录将被永久删除,此操作无法撤销。`,
'sessionsOverview.selectSession': (v) => `选择 ${v?.name ?? ''}`,
'sessionsOverview.status.askUserQuestion': '需要用户输入',
'sessionsOverview.status.needsApproval': '待审批',
'sessionsOverview.status.running': '运行中',
'sessionsOverview.title': '会话总览',
'workspacesOverview.title': '工作区总览',
'workspacesOverview.count': (v) => `${v?.count ?? 0} 个工作区`,
'workspacesOverview.column.name': '名称',
'workspacesOverview.column.path': '路径',
'workspacesOverview.column.sessions': '会话',
'workspacesOverview.column.mcp': 'MCP',
'workspacesOverview.column.git': '分支',
'workspacesOverview.column.lastActivity': '最近活动',
'workspacesOverview.column.actions': '操作',
'workspacesOverview.primaryBadge': '主工作区',
'workspacesOverview.running': (v) => `${v?.count ?? 0} 个运行中`,
'workspacesOverview.attention': (v) => `${v?.count ?? 0} 个待处理`,
'workspacesOverview.truncated': '会话超过一页,计数为下限。',
'workspacesOverview.dirty': (v) => `${v?.count ?? 0} 处改动`,
'workspacesOverview.mcpFailed': (v) => `${v?.count ?? 0} 个失败`,
'workspacesOverview.newTask': '新建任务',
'workspacesOverview.trust': '信任',
'workspacesOverview.trusting': '正在信任…',
'workspacesOverview.trustFailed': '无法信任该工作区',
'workspacesOverview.remove': '移除工作区',
'workspacesOverview.back': '返回',
'splitView.title': '分屏',
'splitView.count': (v) => `${v?.count ?? 0} 个窗格`,
'splitView.addPane': '添加会话',
'splitView.closePane': '关闭窗格',
'splitView.maximizePane': '最大化窗格',
'splitView.restorePane': '还原窗格',
'splitView.morePaneActions': '更多窗格操作',
'splitView.defaultActionLabel': '操作',
'splitView.paneError': '此会话窗格出错',
'splitView.paneConnectionError': '连接已断开',
'splitView.outerApprovalPending': '主会话正在等待审批。',
'splitView.goToApproval': '前往处理',
'splitView.pendingCount': (v) => `${v?.count ?? 0} 个会话待处理`,
'splitView.nextPending': '前往下一个待处理会话',
'splitView.empty': '分屏中还没有会话,添加一个开始。',
'splitView.composerPlaceholder': '给这个会话发消息…',
'channels.title': '频道',
'channels.description': '让 Qwen Code 在团队日常使用的平台中收发消息。',
'channels.summary': (v) =>
`${v?.workspace ?? ''} · 已配置 ${v?.count ?? 0} 个`,
'channels.workspace.current': '当前工作区',
'channels.workspace.label': '工作区',
'channels.workspace.primary': '主工作区',
'channels.loading': '正在加载频道',
'channels.configuredCount': (v) => `已配置 ${v?.count ?? 0} 个频道`,
'channels.configured': '已配置频道',
'channels.configured.description': '管理当前工作区中负责收发消息的机器人。',
'channels.availablePlatforms': '可连接平台',
'channels.availablePlatforms.description':
'选择一个平台,为当前工作区添加新的连接。',
'channels.platform.available': '已开放',
'channels.platform.configure': '配置',
'channels.platform.add': '添加连接',
'channels.platform.configureNamed': (v) => `配置${v?.platform ?? '频道'}`,
'channels.status.stopped': '已停止',
'channels.status.starting': '启动中',
'channels.status.connected': '已连接',
'channels.status.partial': '部分连接',
'channels.status.error': '错误',
'channels.statusDescription.stopped': '当前离线,不会接收新消息。',
'channels.statusDescription.starting': '正在连接平台。',
'channels.statusDescription.connected': '在线,可以正常接收消息。',
'channels.statusDescription.partial': '已经连接,但部分能力暂不可用。',
'channels.statusDescription.error': '需要处理问题后才能重新连接。',
'channels.startsWithServe': 'Qwen Code 启动时自动连接',
'channels.startsWithServe.description': 'Qwen Code 启动后自动让该频道上线。',
'channels.unsupported.title': '当前版本不支持频道管理',
'channels.unsupported.description': '请升级 Qwen Code 到支持频道管理的版本。',
'channels.readOnly.title': '频道管理为只读模式',
'channels.readOnly.description':
'请使用 bearer token 重启 Qwen Code,以控制频道。',
'channels.loadError.title': '无法加载频道',
'channels.empty.title': '尚未配置支持的频道',
'channels.empty.description':
'配置钉钉、企业微信、飞书、GitHub 或 GitLab,让当前工作区接收消息。',
'channels.runtimeError': '频道运行时错误',
'channels.action.back': '返回',
'channels.action.refresh': '刷新',
'channels.action.start': '启动',
'channels.action.stop': '停止',
'channels.action.restart': '重启',
'channels.action.retry': '重试',
'channels.action.edit': '编辑',
'channels.action.editNamed': (v) => `编辑${v?.name ?? '频道'}`,
'channels.action.moreNamed': (v) => `${v?.name ?? '频道'}的更多操作`,
'channels.action.delete': '删除',
'channels.action.deleteNamed': (v) => `删除${v?.name ?? '频道'}`,
'channels.action.startWithServeNamed': (v) =>
`让 ${v?.name ?? ''} 随服务启动`,
'channels.delete.title': (v) => `删除${v?.name ?? '频道'}?`,
'channels.delete.description':
'该频道将停止运行,并从当前工作区移除。此操作无法撤销。',
'channels.delete.error': '未能删除频道',
'channels.editor.addTitle': (v) => `配置${v?.platform ?? '频道'}`,
'channels.editor.editTitle': (v) => `编辑${v?.platform ?? '频道'}`,
'channels.editor.addDescription': '将已注册的工作区连接到已有的平台应用。',
'channels.editor.editDescription': '更新公开配置,或明确更改已保存的凭据。',
'channels.editor.section.identity': '频道标识',
'channels.editor.section.credentials': '应用凭据',
'channels.editor.section.session': '会话管理',
'channels.editor.section.access': '访问控制',
'channels.editor.section.access.description':
'分别设置谁可以私聊,以及哪些群聊可以使用此频道。',
'channels.editor.session.isolation': '会话隔离方式',
'channels.editor.instanceName': '实例名称',
'channels.editor.instanceNamePlaceholder': '例如 release-bot',
'channels.editor.workspace': '工作区',
'channels.editor.workspace.description':
'机器人消息、会话和频道配置都归属此工作区;默认选择主工作区。',
'channels.editor.workspace.lockedDescription':
'已配置的频道会固定归属当前工作区;如需更换,请新建一个频道实例。',
'channels.editor.environmentReference': '支持 $ENV_VAR',
'channels.editor.field.sessionScope': '会话作用域',
'channels.editor.field.sessionScope.description':
'控制哪些来源的消息共享同一个 Agent 会话。',
'channels.editor.field.sessionScope.option.user': '按用户和对话',
'channels.editor.field.sessionScope.option.thread': '按话题',
'channels.editor.field.sessionScope.option.chat_thread': '按对话和话题',
'channels.editor.field.sessionScope.option.single': '整个频道共享',
'channels.editor.field.dingtalk.clientId': 'Client ID(原 AppKey)',
'channels.editor.field.dingtalk.clientSecret':
'Client Secret(原 AppSecret)',
'channels.editor.field.wecom.botId': 'Bot ID',
'channels.editor.field.wecom.secret': 'Bot Secret',
'channels.editor.field.wecom.wsUrl': 'WebSocket URL',
'channels.editor.field.feishu.clientId': 'App ID',
'channels.editor.field.feishu.clientSecret': 'App Secret',
'channels.editor.field.github.token': '个人访问令牌',
'channels.editor.field.github.token.description':
'可选。填写具有 "notifications" 权限的经典 PAT;优先于本地 gh 认证',
'channels.editor.field.github.useLocalGh': '使用本地 GitHub CLI 认证',
'channels.editor.field.github.useLocalGh.description':
'未配置令牌时,显式复用 daemon 主机上账户级的 gh 登录',
'channels.editor.field.github.baseUrl': 'API 基础 URL',
'channels.editor.field.github.baseUrl.description':
'GitHub Enterprise API 根地址(如 https://ghe.example.com/api/v3),github.com 留空',
'channels.editor.field.github.groupPolicy': '群组策略',
'channels.editor.field.github.groupPolicy.description':
'必须设为 "Open"、"Allowlist" 或 "Pairing" 才能接收通知',
'channels.editor.field.github.reasonFilter': '通知原因过滤',
'channels.editor.field.github.reasonFilter.description':
'可选。逗号分隔的通知原因。有效值:mention、review_requested、assign、author、comment、ci_activity、manual、state_change、subscribed、team_mention、security_alert、approval_requested、invitation、member_feature_requested、security_advisory_credit。留空则处理全部。',
'channels.editor.field.gitlab.token': '个人访问令牌',
'channels.editor.field.gitlab.token.description':
'需要 "read_api" + "api" 权限的 PAT',
'channels.editor.field.gitlab.baseUrl': '实例 URL',
'channels.editor.field.gitlab.baseUrl.description':
'自托管实例地址(如 https://gitlab.example.com),gitlab.com 留空',
'channels.editor.field.gitlab.groupPolicy': '群组策略',
'channels.editor.field.gitlab.groupPolicy.description':
'必须设为 "Open"、"Allowlist" 或 "Pairing" 才能处理 Todo',
'channels.editor.field.gitlab.action_prompt_template': '动作模板',
'channels.editor.field.gitlab.action_prompt_template.description':
'仅配置了模板的动作会被处理,其余跳过。模板变量:%project%、%project_url%、%author%、%target_type%、%iid%、%title%、%description%、%todo_id%。用 %% 表示字面 %。示例(mentioned):Project: %project% | Author: %author% | Title: %title%',
'channels.editor.field.gitlab.action_prompt_template.option.mentioned':
'被提及 — 评论或描述中 @bot',
'channels.editor.field.gitlab.action_prompt_template.option.directly_addressed':
'直接对话 — 评论以 @bot 开头',
'channels.editor.field.gitlab.action_prompt_template.option.assigned':
'被指派 — bot 被指派到 issue 或 MR',
'channels.editor.field.gitlab.action_prompt_template.option.review_requested':
'请求审查 — bot 被请求为 MR 审查者',
'channels.editor.field.gitlab.action_prompt_template.option.approval_required':
'需要批准 — MR 需要 bot 批准',
'channels.editor.field.gitlab.action_prompt_template.option.marked':
'被标记 — 有人星标 bot 的评论/issue/MR',
'channels.editor.field.gitlab.action_prompt_template.option.build_failed':
'构建失败 — CI/CD 流水线在 bot 分支/MR 上失败',
'channels.editor.field.gitlab.action_prompt_template.option.unmergeable':
'不可合并 — MR 变为不可合并(冲突)',
'channels.editor.field.gitlab.action_prompt_template.option.merge_train_removed':
'合并队列移除 — MR 从合并队列中移除',
'channels.editor.secret.environment': '已保存在环境变量中',
'channels.editor.secret.stored': '已安全保存',
'channels.editor.secret.preserve': '保留',
'channels.editor.secret.replace': '替换',
'channels.editor.secret.clear': '清除',
'channels.editor.secret.placeholder': (v) => `请输入${v?.label ?? '密钥'}`,
'channels.editor.secret.clearHint': '保存后将移除此凭据。',
'channels.editor.field.shared.outputMode': '输出模式',
'channels.editor.field.shared.outputMode.description':
'选择在整个任务完成后、每次完整回复后,或每轮结束时发送最后一条回复。默认按轮输出:主回复独立结束,后台后续回复单独发送。适用于卡片和普通消息。',
'channels.editor.field.shared.outputMode.option.per_task': '按任务',
'channels.editor.field.shared.outputMode.option.per_response': '按回复',
'channels.editor.field.shared.outputMode.option.per_turn': '按轮(默认)',
'channels.editor.field.shared.privatePolicy': '私聊策略',
'channels.editor.field.dws.privatePolicy': '私聊策略',
'channels.editor.field.dws.privatePolicy.description':
'控制哪些用户可以通过私聊、文档通知和原生待办启动任务。',
'channels.editor.field.shared.privatePolicy.description':
'选择哪些用户可以通过私聊使用此频道。',
'channels.editor.field.shared.privatePolicy.option.disabled': '禁用',
'channels.editor.field.shared.privatePolicy.option.pairing': '配对',
'channels.editor.field.shared.privatePolicy.option.allowlist': '白名单',
'channels.editor.field.shared.privatePolicy.option.open': '开放',
'channels.editor.field.shared.allowedUsers': '允许的用户 ID',
'channels.editor.field.shared.allowedUsers.description':
'用英文逗号分隔稳定用户 ID;这些用户无需配对即可发起私聊。',
'channels.editor.field.shared.groupPolicy': '群聊策略',
'channels.editor.field.shared.groupPolicy.description':
'选择哪些群聊可以使用此频道。',
'channels.editor.field.shared.groupPolicy.option.disabled': '禁用',
'channels.editor.field.shared.groupPolicy.option.pairing': '配对',
'channels.editor.field.shared.groupPolicy.option.allowlist': '白名单',
'channels.editor.field.shared.groupPolicy.option.open': '开放',
'channels.editor.field.shared.allowedGroupIds': '允许的群聊 ID',
'channels.editor.field.shared.allowedGroupIds.description':
'用英文逗号分隔允许使用此频道的稳定群聊或代码仓库 ID。',
'channels.editor.field.shared.allowedGroupIds.placeholder':
'group-a, group-b',
'channels.editor.field.shared.groupSenders': '群内谁能发言',
'channels.editor.field.shared.groupSenders.description':
'对所有已放行的群生效。如需单独设置某个群,请在 settings.json 中配置。',
'channels.editor.field.shared.groupSenders.option.open': '任何群成员',
'channels.editor.field.shared.groupSenders.option.allowlist': '仅名单内成员',
'channels.editor.field.shared.groupAllowedUsers': '允许发言的群成员 ID',
'channels.editor.field.shared.groupAllowedUsers.description':
'用英文逗号分隔可以在群内发言的稳定用户 ID;与私聊的允许用户 ID 相互独立。',
'channels.editor.field.shared.groupAllowedUsers.placeholder':
'user-a, user-b',
'channels.editor.field.shared.operators': '会话管理者',
'channels.editor.field.shared.operators.description':
'用英文逗号分隔可以在共享会话中批准工具调用、执行 /cancel、/clear 或 /loop 的用户 ID。留空则不授予共享会话管理权限。',
'channels.editor.field.shared.sessionScope': '会话隔离方式',
'channels.editor.field.shared.sessionScope.description':
'选择不同对话如何共享持久化的智能体上下文。',
'channels.editor.field.shared.sessionScope.option.user': '按用户隔离',
'channels.editor.field.shared.sessionScope.option.thread':
'按话题隔离(旧版)',
'channels.editor.field.shared.sessionScope.option.chat_thread':
'按群/话题隔离',
'channels.editor.field.shared.sessionScope.option.single': '全部共享',
'channels.editor.field.shared.sessionScope.detail.user':
'同一用户的消息进入同一个对话,不同用户互不影响。',
'channels.editor.field.shared.sessionScope.detail.thread':
'保留已有频道会话使用的旧版话题路由。',
'channels.editor.field.shared.sessionScope.detail.chat_thread':
'同一群聊或话题进入同一个对话,适合群内协作。',
'channels.editor.field.shared.sessionScope.detail.single':
'所有消息共用一个对话,适合单一机器人值守场景。',
'channels.editor.field.shared.multiSession': '命名任务',
'channels.editor.field.shared.instructions': '指引',
'channels.editor.field.shared.instructions.description':
'注入到每个频道会话上下文中的指引。部分频道在设置后会用它替换自身的默认指引。',
'channels.editor.field.shared.multiSession.description':
'在 daemon 托管模式下,为每位用户保留相互隔离的命名任务目录。',
'channels.editor.policy.disabled.title': '禁用',
'channels.editor.policy.disabled.description': '禁用私聊。',
'channels.editor.policy.allowlist.title': '白名单',
'channels.editor.policy.allowlist.description': '仅名单内用户可以发起私聊。',
'channels.editor.policy.pairing.title': '配对模式',
'channels.editor.policy.pairing.description':
'用户会收到配对码,经您批准后才能开始对话。',
'channels.editor.pairing.title': '待处理的配对请求',
'channels.editor.pairing.description':
'批准前,请核对收到的配对码是否一致。批准会立即生效,保存或取消都不会撤销已批准的访问。',
'channels.editor.pairing.subject.group': (v) =>
`群聊:${v?.name ?? '未知群聊'}`,
'channels.editor.pairing.requestedBy': (v) =>
`由 ${v?.sender ?? '未知用户'} 发起`,
'channels.editor.pairing.refresh': '刷新配对请求',
'channels.editor.pairing.approve': '批准',
'channels.editor.pairing.approveFor': (v) =>
`批准${v?.sender ?? '该请求'},配对码 ${v?.code ?? ''}`,
'channels.editor.pairing.approved': (v) =>
`${v?.sender ?? '该用户'}现在可以使用此频道。`,
'channels.editor.pairing.error': '未能更新配对请求',
'channels.editor.pairing.unavailable': '暂时无法获取配对请求,请重试。',
'channels.editor.pairing.retry': '重试',
'channels.editor.pairing.empty.title': '暂无待处理请求',
'channels.editor.pairing.empty.description':
'用户向机器人发送消息后,新的配对请求会显示在这里。',
'channels.editor.pairing.saveFirst.title': '请先保存配对模式',
'channels.editor.pairing.saveFirst.description':
'频道以配对模式保存后,待处理请求会显示在这里。',
'channels.editor.pairing.approvals.title': '已配对对象',
'channels.editor.pairing.approvals.description':
'通过配对获得此频道访问权限的用户和群聊 ID。',
'channels.editor.pairing.approvals.refresh': '刷新已配对对象',
'channels.editor.pairing.approvals.revoke': '撤销',
'channels.editor.pairing.approvals.revokeFor': (v) =>
`撤销 ${v?.senderId ?? '该用户'} 的配对授权`,
'channels.editor.pairing.approvals.revoked': (v) =>
`已撤销 ${v?.senderId ?? '该用户'} 的配对授权。`,
'channels.editor.pairing.approvals.error': '未能更新已配对对象',
'channels.editor.pairing.approvals.unavailable':
'暂时无法获取已配对对象,请重试。',
'channels.editor.pairing.approvals.empty.title': '暂无已配对对象',
'channels.editor.pairing.approvals.empty.description':
'批准配对请求后,用户或群聊 ID 会显示在这里。',
'channels.editor.pairing.approvals.confirm.title': (v) =>
`撤销 ${v?.senderId || '该用户'} 的配对授权?`,
'channels.editor.pairing.approvals.confirm.description':
'只会移除通过配对获得的授权,不会更改频道配置中的白名单访问权限。',
'channels.editor.pairing.approvals.confirm.action': '撤销授权',
'channels.editor.pairing.allowlist.title': '配置白名单',
'channels.editor.pairing.allowlist.description':
'撤销配对授权后,配置白名单中的用户仍然可以访问此频道。',
'channels.editor.policy.open.title': '开放模式',
'channels.editor.policy.open.description':
'所有能够访问机器人的用户均可直接开始对话。',
'channels.editor.validation.required': (v) =>
`${v?.label ?? '此字段'}为必填项。`,
'channels.editor.validation.credential':
'请输入令牌,或开启本地 GitHub CLI 认证。',
'channels.editor.validation.duplicate': '已存在同名频道。',
'channels.editor.validation.invalidName': '请使用其他实例名称。',
'channels.editor.validation.invalidGroupId':
'群聊 ID 不能是 __proto__、constructor 或 prototype。',
'channels.editor.validation.invalidOption': '请移除不在允许列表中的值。',
'channels.editor.validation.number': '请输入有效数字。',
'channels.editor.validation.outOfRange': (v) =>
`请输入大于 ${v?.min ?? 0} 的数字。`,
'channels.editor.validation.policy': '请选择准入策略。',
'channels.editor.saveError': '未能保存更改',
'channels.editor.reloadLatest': '加载最新配置',
'channels.editor.cancel': '取消',
'channels.editor.save': '保存',
'localControl.open': '手机访问',
'localControl.expires': (v) =>
`一次性二维码 · ${v?.seconds ?? ''} 秒后过期 · 自动刷新`,
'localControl.expired': '二维码已过期,正在获取新码…',
'localControl.retry': '重试',
'localControl.noNetwork':
'没有可用的局域网地址。请通过手机可访问的地址打开 Web Shell。',
'localControl.securePairing': '扫码将授予访问权限,直到 daemon 重启。',
'localControl.insecurePairing':
'扫码将授予访问权限,直到 daemon 重启。流量未加密,请使用受信任网络。',
'localControl.securePairingDynamic':
'扫码将授予此 daemon 的访问权限。扫码的设备保持登录,直到 daemon 重启或该设备上的标签页关闭。',
'localControl.insecurePairingDynamic':
'扫码将授予此 daemon 的访问权限。扫码的设备保持登录,直到 daemon 重启或该设备上的标签页关闭。流量未加密,请使用受信任网络。',
'localControl.disabledHint':
'本地控制未开启。请在设置中开启后,配对同一网络下的手机。',
'localControl.openSettings': '打开设置',
'browserNotifications.label': '任务通知',
'browserNotifications.description':
'页面在后台或窗口失焦时,提醒当前聊天和分屏聊天的回合结束、失败、需要审批或等待回答。回合结束通知包含提问和回复摘录;待处理提醒只显示会话标题和等待状态。仅保存在此浏览器站点;网页需保持打开。',
'browserNotifications.prompt': (v) => `提问:${v?.text ?? ''}`,
'browserNotifications.reply': (v) => `回复:${v?.text ?? ''}`,
'browserNotifications.completed': '本轮已完成。',
'browserNotifications.failed': '本轮执行失败,请返回查看。',
'browserNotifications.ended': '本轮已结束,请返回查看结果。',
'browserNotifications.approval': '此会话需要你的审批,请返回查看请求。',
'browserNotifications.question': '此会话正在等待你的回答,请返回处理。',
'browserNotifications.allow': '允许通知',
'browserNotifications.enable': '开启通知',
'browserNotifications.helpEnabled': '已为此站点开启通知。',
'browserNotifications.helpWaiting': '尚未获得浏览器通知授权。',
'browserNotifications.helpWhen':
'页面在后台或者切换到其他页签时,当前聊天需要审批、等待回答、回合结束或失败会发送提醒,点击通知返回对应聊天,不会自动审批或回答。',
'browserNotifications.helpSystem':
'如果没有收到提醒,请按下方指引检查系统通知',
'browserNotifications.helpMac':
'打开“系统设置 → 通知”,选择浏览器(Chrome 如列有 Google Chrome Helper (Alerts),也需检查),开启允许通知及桌面横幅/提醒。检查专注模式,以及屏幕共享时是否允许通知。',
'browserNotifications.helpWindows':
'打开“设置 → 系统 → 通知”(Windows 10 为“通知和操作”),开启通知及浏览器通知,并允许显示通知横幅。关闭“请勿打扰/专注助手”,或在其规则中允许浏览器通知。',
'browserNotifications.enabled': '已开启。',
'browserNotifications.disabled': '未开启。',
'browserNotifications.waiting': '等待浏览器授权。',
'browserNotifications.denied': '浏览器已阻止通知,请在浏览器站点设置中允许。',
'browserNotifications.unavailable': '当前浏览器或页面环境无法使用通知。',
'browserNotifications.requesting': '等待你的授权…',
'browserNotifications.error': '无法启用或显示通知,请检查浏览器及系统设置。',
'browserNotifications.temporary': '设置仅在当前页面有效。',
'welcome.modeHint': 'Shift+Tab 或 /approval-mode',
'welcome.prompt': '你想构建什么?',
'welcome.titlePrefix': '欢迎使用',
'welcome.tipLabel': '提示:',
...VOICE_MESSAGES_ZH,
...LIVE_MESSAGES_ZH,
...COLLAB_MESSAGES_ZH,
...SETTINGS_MESSAGES_ZH,
...MANAGED_TASK_MESSAGES_ZH,
...TRAJECTORY_FILTER_MESSAGES_ZH,
...TRAJECTORY_WINDOW_MESSAGES_ZH,
};
const MESSAGES: Record<WebShellLanguage, Messages> = {
en: EN,
'zh-CN': ZH,
};
const LANGUAGE_LABELS: Record<WebShellLanguage, string> = {
en: 'English [en]',
'zh-CN': '中文 [zh-CN]',
};
const Context = createContext<{
language: WebShellLanguage;
t: (key: string, vars?: Record<string, string | number>) => string;
}>({
language: 'en',
t: (key) => key,
});
export function normalizeLanguage(
value: string | undefined | null,
): WebShellLanguage {
const normalized = value?.trim().toLowerCase();
if (!normalized) return 'en';
if (normalized === 'zh' || normalized === 'zh-cn' || normalized === 'zh_cn') {
return 'zh-CN';
}
return 'en';
}
export function languageSettingToWebShellLanguage(
value: unknown,
): WebShellLanguage | undefined {
if (typeof value !== 'string') return undefined;
const normalized = value.trim().toLowerCase().replace(/_/g, '-');
if (!normalized) return undefined;
if (normalized === 'auto') {
return normalizeLanguage(
typeof navigator !== 'undefined' ? navigator.language : undefined,
);
}
if (
normalized === 'zh' ||
normalized === 'zh-cn' ||
normalized === 'chinese' ||
normalized === '中文'
) {
return 'zh-CN';
}
if (
normalized === 'en' ||
normalized === 'en-us' ||
normalized === 'english'
) {
return 'en';
}
return undefined;
}
export function languageLabel(language: WebShellLanguage): string {
return LANGUAGE_LABELS[language];
}
export function getTranslator(language: WebShellLanguage) {
const messages = MESSAGES[language];
return (key: string, vars?: Record<string, string | number>) => {
const message = messages[key] ?? EN[key] ?? key;
return typeof message === 'function' ? message(vars) : message;
};
}
export function I18nProvider({
language,
children,
}: PropsWithChildren<{ language: WebShellLanguage }>) {
const value = useMemo(() => {
return {
language,
t: getTranslator(language),
};
}, [language]);
return <Context.Provider value={value}>{children}</Context.Provider>;
}
export function useI18n() {
return useContext(Context);
}