* feat: auto-poll Docker capabilities while Docker tab is active
When the Docker tab is visible and hasDocker is not yet true,
poll refreshCapabilities() at the process refresh interval.
Stop polling once hasDocker becomes true, or when switching
to a different tab.
* fix: use resolvedTab instead of activeTab for Docker auto-poll condition
The auto-poll useEffect condition used activeTab, which stays stale
when Docker becomes unavailable. Changed to resolvedTab which reflects
the actual displayed tab. Also updated the dep array.
* fix: replace setInterval with setTimeout recursion in Docker tab probe
Replace setInterval-based polling with setTimeout recursion in the Docker
tab capability probe effect. This ensures the next probe only starts after
the previous one finishes, avoiding overlapping probes when SSH timeout
exceeds the polling interval.
- Add dockerPollTimerRef to track the timeout handle
- Use async pollOnce() that awaits refreshCapabilities() before scheduling next
- Use cancelled flag in cleanup to prevent scheduling after unmount
- Keep same dependency array for correctness
* fix: stabilize docker poll timer by using useRef for refreshCapabilities
refreshCapabilities() can return a new reference on every render, causing
the useEffect to re-run on every render — cleanup cancels the polling timer,
then the effect immediately calls pollOnce(), effectively bypassing the
configured timeout interval.
Fix: store refreshCapabilities in a useRef (refreshRef), use
refreshRef.current() inside pollOnce(), and replace refreshCapabilities
with refreshRef in the useEffect dependency array.
Closes #PR1456 Codex P2 review item.
* fix: delay auto-poll first probe by one interval to avoid overlap with tab-switch probe
When switching to the Docker tab, two mechanisms were triggering probes:
1. tab-switch effect (line 67-76): immediate probe via refreshCapabilities()
2. auto-poll effect: pollOnce() executing immediately on mount
This caused duplicate probes that waste SSH channel resources.
Fix: pollOnce() no longer fires on mount. Instead, the effect schedules the
first probe with setTimeout(pollOnce, capabilitiesTtlMs), so the first probe
happens after one full interval. Subsequent probes continue at interval pace
via the setTimeout recursion in pollOnce itself.
The tab-switch effect still fires the immediate probe (the correct one),
so responsiveness on tab switch is preserved.
* fix: reset cancelledRef in effect body to prevent permanent stalling of Docker polling
The cancelledRef was set to true in the cleanup function when dependencies
changed, but never reset when the effect re-ran. This caused pollOnce to
always early-return on subsequent timer ticks, permanently halting
Docker capability probing after the first dependency change.
* fix(system-manager): replace cancelledRef with closure variables for per-effect cancellation
Each effect generation now has its own and closure
variables instead of shared / . This
prevents stale probes from surviving cleanup when the panel hides and
re-shows (Codex P2 review).
* fix: wrap refreshCapabilities in try/catch to keep polling on exception
If refreshCapabilities throws (instead of returning {success: false}),
the await would exit pollOnce without scheduling the next setTimeout,
silently killing Docker auto-detection polling.
* fix: add in-flight probe guard to prevent tab-switch and auto-poll concurrent probes
Add probingRef to track whether a capabilities probe is already in-flight.
- Tab-switch effect for Docker branch checks probingRef before starting a new probe
- Auto-poll pollOnce checks probingRef at entry and sets/clears it around the actual probe
- Tmux branch left unchanged as it has no auto-poll overlap risk
* fix: re-schedule next poll timer when probe is in-flight
When probingRef.current is true (tab-switch probe still running),
pollOnce was returning early without scheduling the next timer,
causing auto-poll to stop permanently afterward.
Now it schedules the next poll within the interval and returns,
so the polling loop keeps running until a slot where no probe is
active.
* fix: convert comments to ASCII-only English
- Line 105: translate Chinese comment to 'probe is in-flight, reschedule for next cycle'
- Line 113: replace em dash (U+2014) with ASCII dash
* feat: session inline rename, closeSession shortcut, pane zoom
* fix: sidebar inline rename with local state
* fix: add sessionDisplayName to terminalPropsAreEqual comparator
The Terminal component is wrapped with React.memo(…, terminalPropsAreEqual),
but the comparator was missing a check for sessionDisplayName. After renaming
a session, the pane title bar would show the old name until some other prop
changed and triggered a re-render.
Add prev.sessionDisplayName === next.sessionDisplayName to the comparator
so that display name changes cause the Terminal to re-render immediately.
* fix: add onStartSessionRename to TerminalLayerWorkspaceSection ctx destructuring and TerminalPanesHost props
* fix: add toggleWorkspaceViewMode to executeHotkeyActionImpl destructuring
The togglePaneZoom handler calls toggleWorkspaceViewMode() but it
wasn't destructured from getCtx(), causing a ReferenceError at runtime.
* fix: restore truncated ctx object in TerminalView render call
The TerminalView ctx object literal on line 1265 was truncated to
'showSele...' due to an editing tool truncation bug, causing
Parsing error: ',' expected on npm run lint / tsc --noEmit.
Restored the missing fields from the base commit:
showSelectionAIAction, snippets, status, statusDotTone, sudoHintRef,
sudoHintText: t("terminal.sudoHint.pressEnter"), t, termRef,
terminalBackend, terminalContextActions, terminalCwdTracker,
terminalPreviewVars, terminalSettings, timeLeft, toast, zmodem
Kept the PR's new additions (isVisible, onRename, sessionDisplayName)
intact.
* fix: add toggleWorkspaceViewMode to executeHotkeyAction context and add terminal.menu.rename translations
- Add toggleWorkspaceViewMode to the context getter in executeHotkeyAction (App.tsx)
- Add terminal.menu.rename translation for en (Rename), zh-CN (重命名), ru (Переименовать)
* fix: validate focusedSessionId before closing in closeSession hotkey
When closeSession hotkey fires, workspace.focusedSessionId may reference
a session that was already closed by another trigger (e.g., mouse click
on tab close button). Collect alive session IDs from the workspace root
and fall back to the first living pane if the stored focusedSessionId
is stale.
* fix(auto-poll): check useSessionCapabilities probing state in pollOnce
When auto-poll timer fires before the initial probe (from
useSessionCapabilities) completes, probingRef.current is still false
because the initial probe doesn't set it — causing a second overlapping
probe.
Add check so that any in-flight probe from any path
(initial/auto-poll/tab-switch) prevents auto-poll overlap.
PR #1459
* fix: address remaining Codex review issues
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: add detach session from workspace with toolbar button and context menu
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: use customName in pane header display name for renamed sessions
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: refine workspace terminal detach interactions
* fix: preserve workspace detach tab ordering
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
693 lines
41 KiB
TypeScript
693 lines
41 KiB
TypeScript
import type { Messages } from '../types';
|
||
|
||
export const zhCNTerminalMessages: Messages = {
|
||
'terminal.sudoHint.pressEnter': '按 Enter 粘贴 sudo 密码',
|
||
'terminal.menu.rename': '重命名',
|
||
'terminal.toolbar.detach': '移出到独立标签',
|
||
'terminal.menu.detach': '从工作区移出',
|
||
'terminal.toolbar.timestampsEnable': '显示时间戳',
|
||
'terminal.toolbar.timestampsDisable': '隐藏时间戳',
|
||
'terminal.connection.protocol.et': 'EternalTerminal',
|
||
'terminal.et.proxyUnsupported': 'EternalTerminal 目前不支持 Netcatty 的代理设置。请改用 SSH,或移除该主机的代理。',
|
||
'terminal.et.multiJumpUnsupported': 'EternalTerminal 目前在 Netcatty 中最多支持一个跳板机。',
|
||
// Command history side panel
|
||
'history.scope.label': '历史范围',
|
||
'history.tab.host': '主机',
|
||
'history.tab.global': '全局',
|
||
'history.searchPlaceholder': '搜索历史命令...',
|
||
'history.loading': '正在读取远程历史...',
|
||
'history.meta.count': '{count} 条',
|
||
'history.empty.noSession': '请先打开一个远程会话以查看其命令历史。',
|
||
'history.empty.unsupportedProtocol': '仅 SSH/Mosh/ET 会话支持命令历史。',
|
||
'history.empty.noHistory': '该主机上未找到命令历史。',
|
||
'history.empty.noGlobalHistory': '暂无全局命令历史。你执行的命令会记录在这里。',
|
||
'history.action.refresh': '刷新',
|
||
'history.action.retry': '重试',
|
||
'history.action.paste': '粘贴到终端',
|
||
'history.action.run': '在终端执行',
|
||
'history.action.saveAsSnippet': '保存为代码片段',
|
||
// SFTP File Opener
|
||
'sftp.context.copyPath': '复制文件路径',
|
||
'sftp.context.openWith': '打开方式...',
|
||
'sftp.context.edit': '编辑',
|
||
'sftp.context.preview': '预览',
|
||
'sftp.opener.title': '打开方式',
|
||
'sftp.opener.desc': '选择一个应用程序来打开此文件',
|
||
'sftp.opener.builtInEditor': '内置编辑器',
|
||
'sftp.opener.editDescription': '编辑文本文件',
|
||
'sftp.opener.builtInImageViewer': '内置图片预览',
|
||
'sftp.opener.previewDescription': '预览图片',
|
||
'sftp.opener.systemApp': '选择应用程序...',
|
||
'sftp.opener.systemAppDescription': '从本地选择一个应用程序',
|
||
'sftp.opener.onlySystemApp': '此文件只能用外部应用程序打开',
|
||
'sftp.opener.noAppsAvailable': '无可用应用程序',
|
||
'sftp.opener.noExtension': '无扩展名文件',
|
||
'sftp.opener.setDefault': '始终使用此方式打开 {ext} 文件',
|
||
'sftp.opener.confirmTitle': '设为默认?',
|
||
'sftp.opener.confirmDescription': '是否始终使用 {app} 打开 {ext} 文件?',
|
||
'sftp.opener.yesRemember': '是,记住此选择',
|
||
'sftp.opener.justOnce': '仅此一次',
|
||
'sftp.opener.confirm.title': '设置默认应用程序',
|
||
'sftp.opener.confirm.desc': '是否始终使用此应用程序打开 .{ext} 文件?',
|
||
'sftp.editor.title': '文本编辑器',
|
||
'sftp.editor.save': '保存到远程',
|
||
'sftp.editor.saving': '保存中...',
|
||
'sftp.editor.saved': '保存成功',
|
||
'sftp.editor.saveFailed': '保存文件失败',
|
||
'sftp.editor.unsavedChanges': '您有未保存的更改。确定要关闭吗?',
|
||
'sftp.editor.syntaxHighlight': '语法高亮',
|
||
'sftp.preview.title': '图片预览',
|
||
'sftp.preview.zoomIn': '放大',
|
||
'sftp.preview.zoomOut': '缩小',
|
||
'sftp.preview.resetZoom': '重置缩放',
|
||
'sftp.preview.fitToWindow': '适应窗口',
|
||
|
||
// Settings > SFTP File Associations
|
||
'settings.tab.sftpFileAssociations': 'SFTP',
|
||
'settings.sftp.transferConcurrency': '传输并发数',
|
||
'settings.sftp.transferConcurrency.desc': '上传或下载文件夹时并行传输的文件数量。较高的值可能提高速度,但可能导致某些服务器过载。',
|
||
'settings.sftp.defaultOpener': '默认文件打开方式',
|
||
'settings.sftp.defaultOpener.desc': '选择没有特定文件关联时的默认打开方式',
|
||
'settings.sftp.defaultOpener.ask': '每次询问',
|
||
'settings.sftp.defaultOpener.askDesc': '每次打开文件时弹出选择对话框',
|
||
'settings.sftp.defaultOpener.builtInDesc': '默认使用内置编辑器打开文本文件',
|
||
'settings.sftp.defaultOpener.systemApp': '选择应用程序...',
|
||
'settings.sftp.defaultOpener.systemAppDesc': '默认使用指定的外部应用程序打开文件',
|
||
'settings.sftpFileAssociations.title': 'SFTP 文件关联',
|
||
'settings.sftpFileAssociations.desc': '配置按扩展名打开文件的默认应用程序',
|
||
'settings.sftpFileAssociations.extension': '扩展名',
|
||
'settings.sftpFileAssociations.application': '应用程序',
|
||
'settings.sftpFileAssociations.noAssociations': '未配置文件关联',
|
||
'settings.sftpFileAssociations.remove': '移除',
|
||
'settings.sftpFileAssociations.removeConfirm': '确定移除 .{ext} 的关联吗?',
|
||
|
||
// Settings > SFTP Behavior
|
||
'settings.sftp.doubleClickBehavior': '双击行为',
|
||
'settings.sftp.doubleClickBehavior.desc': '选择在 SFTP 视图中双击文件时的操作',
|
||
'settings.sftp.doubleClickBehavior.open': '打开文件',
|
||
'settings.sftp.doubleClickBehavior.transfer': '传输到另一侧',
|
||
'settings.sftp.doubleClickBehavior.openDesc': '使用默认应用程序打开文件',
|
||
'settings.sftp.doubleClickBehavior.transferDesc': '将文件传输到另一窗格的活动主机',
|
||
|
||
// Settings > SFTP Auto Sync
|
||
'settings.sftp.autoSync': '自动同步到远程',
|
||
'settings.sftp.autoSync.desc': '使用外部应用程序打开文件时,自动将文件更改同步回远程服务器',
|
||
'settings.sftp.autoSync.enable': '启用自动同步',
|
||
'settings.sftp.autoSync.enableDesc': '在外部应用程序中保存文件时,更改将自动上传到远程服务器',
|
||
|
||
// Settings > SFTP 自动打开侧栏
|
||
'settings.sftp.autoOpenSidebar': '连接时自动打开侧栏',
|
||
'settings.sftp.autoOpenSidebar.desc': '连接到主机时自动打开 SFTP 文件浏览器侧栏',
|
||
'settings.sftp.autoOpenSidebar.enable': '启用自动打开侧栏',
|
||
'settings.sftp.autoOpenSidebar.enableDesc': '当终端会话连接到远程主机时,SFTP 侧栏将自动打开',
|
||
|
||
'settings.sftp.followTerminalCwd': '追随终端目录',
|
||
'settings.sftp.followTerminalCwd.desc': '在侧栏 SFTP 中自动跟随终端当前工作目录变化(可在工具栏切换)',
|
||
'settings.sftp.followTerminalCwd.enable': '默认开启追随终端目录',
|
||
'settings.sftp.followTerminalCwd.enableDesc': '打开侧栏 SFTP 时默认启用追随模式,终端执行 cd 后文件浏览器会自动跳转',
|
||
|
||
'settings.sftp.defaultViewMode': '默认视图模式',
|
||
'settings.sftp.defaultViewMode.desc': '选择打开新 SFTP 标签页时的默认视图模式。每个主机的偏好设置会覆盖此全局设置。',
|
||
'settings.sftp.defaultViewMode.list': '列表视图',
|
||
'settings.sftp.defaultViewMode.listDesc': '以平面列表显示当前目录的文件',
|
||
'settings.sftp.defaultViewMode.tree': '树形视图',
|
||
'settings.sftp.defaultViewMode.treeDesc': '以层级树形结构显示文件',
|
||
|
||
'sftp.autoSync.success': '文件已同步到远程:{fileName}',
|
||
'sftp.autoSync.error': '同步文件失败:{error}',
|
||
|
||
// SFTP Folder Upload Progress
|
||
'sftp.upload.progress': '正在上传 {current}/{total} 个文件...',
|
||
'sftp.upload.uploading': '正在上传...',
|
||
'sftp.upload.compressing': '正在压缩...',
|
||
'sftp.upload.extracting': '正在解压...',
|
||
'sftp.upload.scanning': '正在扫描文件...',
|
||
'sftp.upload.completed': '已完成',
|
||
'sftp.upload.compressed': '压缩传输',
|
||
'sftp.upload.currentFile': '当前: {fileName}',
|
||
'sftp.upload.cancelled': '上传已取消',
|
||
'sftp.upload.cancel': '取消',
|
||
'sftp.upload.completedToPath': '已上传至 {path}',
|
||
|
||
// SFTP Download
|
||
'sftp.download.completed': '已下载',
|
||
'sftp.download.cancelled': '下载已取消',
|
||
|
||
// SFTP Reconnecting
|
||
'sftp.reconnecting.title': '正在重连...',
|
||
'sftp.reconnecting.desc': '连接已断开,正在尝试重新连接',
|
||
'sftp.reconnected': '连接已恢复',
|
||
'sftp.error.reconnectFailed': '重连失败,请重试。',
|
||
'sftp.error.connectionLostManual': '连接已断开,请手动重新连接。',
|
||
'sftp.error.connectionLostReconnecting': '连接已断开,正在重连...',
|
||
'sftp.error.sessionLost': 'SFTP 会话已断开,请重新连接。',
|
||
|
||
// Settings > SFTP Show Hidden Files
|
||
'settings.sftp.showHiddenFiles': '显示隐藏文件',
|
||
'settings.sftp.showHiddenFiles.desc': '在 SFTP 文件浏览器中显示隐藏文件(Unix/macOS 点文件和 Windows 隐藏属性文件)。',
|
||
'settings.sftp.showHiddenFiles.enable': '显示隐藏文件',
|
||
'settings.sftp.showHiddenFiles.enableDesc': '浏览本地和远程文件系统时显示隐藏文件',
|
||
|
||
// Settings > SFTP Compressed Upload
|
||
'settings.sftp.compressedUpload': '文件夹压缩传输',
|
||
'settings.sftp.compressedUpload.desc': '上传前压缩文件夹,可大幅减少传输时间。',
|
||
'settings.sftp.compressedUpload.enable': '启用文件夹压缩',
|
||
'settings.sftp.compressedUpload.enableDesc': '自动使用 tar 压缩文件夹后再传输。需要服务器支持 tar 命令,不支持时自动回退到普通传输。',
|
||
|
||
// Settings > Terminal
|
||
'settings.terminal.section.theme': '终端主题',
|
||
'settings.terminal.themeModal.title': '选择主题',
|
||
'settings.terminal.themeModal.darkThemes': '深色主题',
|
||
'settings.terminal.themeModal.lightThemes': '浅色主题',
|
||
'settings.terminal.theme.selectButton': '选择主题',
|
||
'settings.terminal.theme.followApp': '跟随应用主题',
|
||
'settings.terminal.theme.followApp.desc': '终端背景色自动匹配当前应用主题,保持视觉一致性。',
|
||
'settings.terminal.theme.darkTheme': '深色模式终端主题',
|
||
'settings.terminal.theme.lightTheme': '浅色模式终端主题',
|
||
'settings.terminal.theme.auto': '自动(跟随界面主题)',
|
||
'settings.terminal.theme.autoDesc': '跟随当前界面主题预设',
|
||
'settings.terminal.section.font': '字体',
|
||
'settings.terminal.section.cursor': '光标',
|
||
'settings.terminal.section.keyboard': '键盘',
|
||
'settings.terminal.section.accessibility': '无障碍',
|
||
'settings.terminal.section.behavior': '行为',
|
||
'settings.terminal.section.scrollback': '回滚',
|
||
'settings.terminal.section.keywordHighlight': '关键字高亮',
|
||
'settings.terminal.font.family': '字体',
|
||
'settings.terminal.font.family.desc': '终端字体',
|
||
'settings.terminal.font.cjk': '中文 / CJK 字体',
|
||
'settings.terminal.font.cjk.desc': '用于渲染中 / 日 / 韩字符的字体;"Auto" 会按主字体智能搭配',
|
||
'settings.terminal.font.cjk.option.auto': 'Auto · 按主字体智能搭配',
|
||
'settings.terminal.font.cjk.option.sarasaSC': 'Sarasa Mono SC (更纱黑体 简)',
|
||
'settings.terminal.font.cjk.option.sarasaTC': 'Sarasa Mono TC (更纱黑体 繁)',
|
||
'settings.terminal.font.cjk.option.mapleCN': 'Maple Mono CN',
|
||
'settings.terminal.font.cjk.option.sourceHan': 'Source Han Mono SC (思源等宽)',
|
||
'settings.terminal.font.cjk.option.notoCJK': 'Noto Sans Mono CJK SC',
|
||
'settings.terminal.font.cjk.option.lxgwWenkai': 'LXGW WenKai Mono (霞鹜文楷等宽)',
|
||
'settings.terminal.font.cjk.option.simSun': 'SimSun (宋体)',
|
||
'settings.terminal.font.cjk.option.legacy': '{font} · 不推荐(非等宽字体)',
|
||
'settings.terminal.font.size': '字体大小',
|
||
'settings.terminal.font.size.desc': '终端文字大小',
|
||
'settings.terminal.font.weight': '字重',
|
||
'settings.terminal.font.weight.desc': '常规文本字重 (100-900)',
|
||
'settings.terminal.font.weightBold': '粗体字重',
|
||
'settings.terminal.font.weightBold.desc': '粗体文本字重 (100-900)',
|
||
'settings.terminal.font.linePadding': '行间距',
|
||
'settings.terminal.font.linePadding.desc': '行之间的额外间距 (0-10)',
|
||
'settings.terminal.font.emulationType': '终端仿真类型',
|
||
'settings.terminal.cursor.style': '光标样式',
|
||
'settings.terminal.cursor.style.block': '块',
|
||
'settings.terminal.cursor.style.bar': '竖线',
|
||
'settings.terminal.cursor.style.underline': '下划线',
|
||
'settings.terminal.cursor.blink': '光标闪烁',
|
||
'settings.terminal.keyboard.altAsMeta': '将 Option 作为 Meta 键',
|
||
'settings.terminal.keyboard.altAsMeta.desc': '使用 Option (Alt) 作为 Meta 键,而不是用于输入特殊字符',
|
||
'settings.terminal.keyboard.optionArrowWordJump': 'Option+←/→ 按单词跳转',
|
||
'settings.terminal.keyboard.optionArrowWordJump.desc': '按 Option+左/右 时发送 Meta-b / Meta-f,让 Shell 按单词移动光标(而非默认的 ^[[1;3D / ^[[1;3C)',
|
||
'settings.terminal.accessibility.minimumContrastRatio': '最小对比度',
|
||
'settings.terminal.accessibility.minimumContrastRatio.desc': '调整颜色以满足对比度要求 (1 = 禁用, 21 = 最大)',
|
||
'settings.terminal.behavior.rightClick': '右键行为',
|
||
'settings.terminal.behavior.rightClick.desc': '在终端中右键时执行的操作',
|
||
'settings.terminal.behavior.rightClick.menu': '显示菜单',
|
||
'settings.terminal.behavior.rightClick.paste': '粘贴',
|
||
'settings.terminal.behavior.rightClick.selectWord': '选择单词',
|
||
'settings.terminal.behavior.copyOnSelect': '选择即复制',
|
||
'settings.terminal.behavior.copyOnSelect.desc': '自动复制选中的文本。在 tmux/vim 鼠标模式下,macOS 按住 Option,Windows/Linux 按住 Shift 拖选即可选中文本',
|
||
'settings.terminal.behavior.middleClickPaste': '中键粘贴',
|
||
'settings.terminal.behavior.middleClickPaste.desc': '中键点击时粘贴剪贴板内容',
|
||
'settings.terminal.behavior.middleClick': '中键行为',
|
||
'settings.terminal.behavior.middleClick.desc': '在终端中点击鼠标中键时执行的操作',
|
||
'settings.terminal.behavior.middleClick.menu': '显示菜单',
|
||
'settings.terminal.behavior.middleClick.paste': '粘贴',
|
||
'settings.terminal.behavior.middleClick.disabled': '无动作',
|
||
'settings.terminal.behavior.bracketedPaste': '括号粘贴模式',
|
||
'settings.terminal.behavior.bracketedPaste.desc':
|
||
'粘贴文本时使用转义序列包裹,以便终端区分粘贴和键入。如果出现 ^[[200~ 字样请关闭此选项。',
|
||
'settings.terminal.behavior.clearWipesScrollback': '`clear` 同时清空回滚历史',
|
||
'settings.terminal.behavior.clearWipesScrollback.desc':
|
||
'`clear` 命令同时清空回滚历史(POSIX 默认行为)。关闭则保留历史。',
|
||
'settings.terminal.behavior.preserveSelectionOnInput': '输入时保留选区',
|
||
'settings.terminal.behavior.preserveSelectionOnInput.desc':
|
||
'键盘输入时不清除鼠标选中的文本,方便选中路径后输入 `sz ` 之类命令再粘贴。',
|
||
'settings.terminal.behavior.forcePromptNewLine': '提示符另起一行',
|
||
'settings.terminal.behavior.forcePromptNewLine.desc':
|
||
'当命令输出的最后一行未以换行符结束时,将识别到的 shell 提示符移动到下一行显示。',
|
||
'settings.terminal.behavior.osc52Clipboard': 'OSC-52 剪贴板',
|
||
'settings.terminal.behavior.osc52Clipboard.desc':
|
||
'允许远程程序(tmux、vim 等)通过 OSC-52 转义序列访问本地剪贴板。',
|
||
'settings.terminal.behavior.osc52Clipboard.off': '关闭',
|
||
'settings.terminal.behavior.osc52Clipboard.writeOnly': '仅写入',
|
||
'settings.terminal.behavior.osc52Clipboard.readWrite': '读写',
|
||
'settings.terminal.behavior.osc52Clipboard.prompt': '写入 + 读取时询问',
|
||
'terminal.osc52.readPrompt.title': '剪贴板读取请求',
|
||
'terminal.osc52.readPrompt.desc': '远程程序正在请求读取您的剪贴板,是否允许?',
|
||
'terminal.osc52.readPrompt.allow': '允许',
|
||
'terminal.osc52.readPrompt.deny': '拒绝',
|
||
'settings.terminal.behavior.scrollOnInput': '输入时自动滚动',
|
||
'settings.terminal.behavior.scrollOnInput.desc': '输入时将终端滚动到底部',
|
||
'settings.terminal.behavior.scrollOnOutput': '输出时自动滚动',
|
||
'settings.terminal.behavior.scrollOnOutput.desc': '有新输出时将终端滚动到底部',
|
||
'settings.terminal.behavior.scrollOnKeyPress': '按键时自动滚动',
|
||
'settings.terminal.behavior.scrollOnKeyPress.desc': '按键(例如 Enter)时将终端滚动到底部',
|
||
'settings.terminal.behavior.scrollOnPaste': '粘贴时自动滚动',
|
||
'settings.terminal.behavior.scrollOnPaste.desc': '粘贴文本时将终端滚动到底部',
|
||
'settings.terminal.behavior.smoothScrolling': '平滑滚动',
|
||
'settings.terminal.behavior.smoothScrolling.desc': '滚动终端视口时使用平滑动画',
|
||
'settings.terminal.behavior.linkModifier': '链接修饰键',
|
||
'settings.terminal.behavior.linkModifier.desc': '按住此键再点击终端中的链接',
|
||
'settings.terminal.behavior.linkModifier.none': '无(直接点击)',
|
||
'settings.terminal.behavior.linkModifier.ctrl': 'Ctrl',
|
||
'settings.terminal.behavior.linkModifier.alt': 'Alt / Option',
|
||
'settings.terminal.behavior.linkModifier.meta': 'Cmd / Win',
|
||
'settings.terminal.scrollback.desc': '限制终端行数。设为 0 表示不限制。',
|
||
'settings.terminal.scrollback.rows': '行数 *',
|
||
'settings.terminal.section.startupCommand': '启动命令',
|
||
'settings.terminal.startupCommandDelay.label': '启动命令延迟(毫秒)',
|
||
'settings.terminal.startupCommandDelay.desc': '连接建立后等待多久再发送启动命令;启动命令为多行时,行与行之间也使用该间隔。慢连接可调大。',
|
||
'settings.terminal.keywordHighlight.title': '关键字高亮',
|
||
'settings.terminal.keywordHighlight.resetColors': '重置为默认颜色',
|
||
'settings.terminal.keywordHighlight.resetDefaults': '把内置规则恢复为默认',
|
||
'settings.terminal.keywordHighlight.resetBuiltIn': '恢复内置标签与正则',
|
||
'settings.terminal.keywordHighlight.addCustom': '添加自定义规则',
|
||
'settings.terminal.keywordHighlight.editCustom': '编辑规则',
|
||
'settings.terminal.keywordHighlight.editBuiltIn': '编辑内置规则',
|
||
'settings.terminal.keywordHighlight.labelField': '标签与颜色',
|
||
'settings.terminal.keywordHighlight.labelPlaceholder': '标签(如 Down)',
|
||
'settings.terminal.keywordHighlight.patternField': '正则表达式',
|
||
'settings.terminal.keywordHighlight.patternPlaceholder': '每行一个正则(如 \\bdown\\b)',
|
||
'settings.terminal.keywordHighlight.patternHint': '每行一个正则。匹配忽略大小写,全局匹配。',
|
||
'settings.terminal.keywordHighlight.invalidPattern': '无效的正则表达式',
|
||
'settings.terminal.keywordHighlight.preview': '预览',
|
||
'settings.terminal.section.localShell': '本地 Shell',
|
||
'settings.terminal.localShell.shell': 'Shell 可执行文件',
|
||
'settings.terminal.localShell.shell.desc': 'Shell 可执行文件的路径(例如 /bin/zsh、pwsh.exe)。留空使用系统默认。',
|
||
'settings.terminal.localShell.shell.placeholder': '系统默认',
|
||
'settings.terminal.localShell.shell.detected': '检测到',
|
||
'settings.terminal.localShell.shell.notFound': '未找到 Shell 可执行文件',
|
||
'settings.terminal.localShell.shell.isDirectory': '路径是目录,不是可执行文件',
|
||
'settings.terminal.localShell.shell.default': '系统默认',
|
||
'settings.terminal.localShell.shell.custom': '自定义...',
|
||
'settings.terminal.localShell.shell.customPath': 'Shell 可执行文件路径',
|
||
'settings.terminal.localShell.shell.customArgs': '启动参数',
|
||
'settings.terminal.localShell.shell.customArgs.placeholder': '例如 --login -i',
|
||
'settings.terminal.localShell.shell.customArgs.desc': '传给 Shell 的启动参数。部分 Shell 必须指定才能正常工作,例如 msys2 bash 需要 --login -i 才能加载环境变量。',
|
||
'settings.terminal.localShell.shell.commonPaths': '常用路径',
|
||
'settings.terminal.localShell.shell.pathValid': '路径有效',
|
||
'settings.terminal.localShell.startDir': '起始目录',
|
||
'settings.terminal.localShell.startDir.desc': '打开本地终端时的起始目录。留空使用用户主目录。',
|
||
'settings.terminal.localShell.startDir.placeholder': '用户主目录',
|
||
'settings.terminal.localShell.startDir.notFound': '目录不存在',
|
||
'settings.terminal.localShell.startDir.isFile': '路径是文件,不是目录',
|
||
'settings.terminal.section.connection': '连接',
|
||
'settings.terminal.connection.keepaliveInterval': '会话保持间隔',
|
||
'settings.terminal.connection.keepaliveInterval.desc': '向服务器发送 SSH 保活数据包的频率(秒)。设为 0 表示全局禁用——单个主机可在自己的设置里覆盖此值。',
|
||
'settings.terminal.connection.keepaliveCountMax': '最大无响应保活次数',
|
||
'settings.terminal.connection.keepaliveCountMax.desc': '判定连接死亡前允许的无响应保活次数。值越大对短暂网络抖动和响应慢的 SSH 服务越宽容。',
|
||
'settings.terminal.connection.x11Display': 'X11 显示地址',
|
||
'settings.terminal.connection.x11Display.desc': '可选的本机 X11 显示地址。留空则使用系统默认值。',
|
||
'settings.terminal.connection.x11Display.placeholder': '自动(:0 或 DISPLAY)',
|
||
'settings.terminal.section.serverStats': '服务器状态(Linux)',
|
||
'settings.terminal.serverStats.show': '显示服务器状态',
|
||
'settings.terminal.serverStats.show.desc': '在终端状态栏显示 CPU、内存和磁盘使用情况(仅限 Linux 服务器)。',
|
||
'settings.terminal.serverStats.refreshInterval': '刷新间隔',
|
||
'settings.terminal.serverStats.refreshInterval.desc': '服务器状态刷新的频率。',
|
||
'settings.terminal.serverStats.seconds': '秒',
|
||
'settings.terminal.section.systemManager': '系统管理',
|
||
'settings.terminal.systemManager.processRefreshInterval': '进程列表刷新间隔',
|
||
'settings.terminal.systemManager.processRefreshInterval.desc': '系统管理侧栏中进程列表的刷新频率。',
|
||
'settings.terminal.systemManager.tmuxRefreshInterval': 'tmux 会话刷新间隔',
|
||
'settings.terminal.systemManager.tmuxRefreshInterval.desc': 'tmux 会话列表的刷新频率。',
|
||
'settings.terminal.systemManager.dockerListRefreshInterval': 'Docker 容器列表刷新间隔',
|
||
'settings.terminal.systemManager.dockerListRefreshInterval.desc': 'Docker 容器列表的刷新频率。',
|
||
'settings.terminal.systemManager.dockerStatsRefreshInterval': 'Docker 性能数据刷新间隔',
|
||
'settings.terminal.systemManager.dockerStatsRefreshInterval.desc': 'Docker 容器 CPU/内存/网络指标的刷新频率。',
|
||
|
||
// Settings > Terminal > Rendering
|
||
'settings.terminal.section.rendering': '渲染',
|
||
'settings.terminal.rendering.renderer': '渲染器',
|
||
'settings.terminal.rendering.renderer.desc': '选择终端渲染技术。自动模式会在低内存设备上使用 DOM 渲染。更改将在新终端会话中生效。',
|
||
'settings.terminal.rendering.auto': '自动',
|
||
|
||
// Settings > Terminal > Autocomplete
|
||
'settings.terminal.section.autocomplete': '自动补全',
|
||
'settings.terminal.autocomplete.enabled': '启用自动补全',
|
||
'settings.terminal.autocomplete.enabled.desc': '输入时根据历史命令和命令规范显示补全建议。',
|
||
'settings.terminal.autocomplete.ghostText': '行内建议',
|
||
'settings.terminal.autocomplete.ghostText.desc': '在光标后显示灰色的建议文本(类似 fish shell)。',
|
||
'settings.terminal.autocomplete.popupMenu': '弹出菜单',
|
||
'settings.terminal.autocomplete.popupMenu.desc': '显示包含多个建议的浮动列表。',
|
||
|
||
// Settings > Shortcuts
|
||
'settings.shortcuts.section.scheme': '快捷键方案',
|
||
'settings.shortcuts.scheme.label': '键盘快捷键',
|
||
'settings.shortcuts.scheme.desc': '选择快捷键使用的键盘布局',
|
||
'settings.shortcuts.scheme.disabled': '禁用',
|
||
'settings.shortcuts.scheme.mac': 'Mac (Cmd)',
|
||
'settings.shortcuts.scheme.pc': 'PC (Ctrl)',
|
||
'settings.shortcuts.disableTerminalFontZoom.label': '禁用终端缩放',
|
||
'settings.shortcuts.disableTerminalFontZoom.desc': '关闭终端文字缩放快捷操作,包括 Cmd/Ctrl 加滚轮。',
|
||
'settings.shortcuts.shellOnlyTabNumberShortcuts.label': '数字键跳过固定标签',
|
||
'settings.shortcuts.shellOnlyTabNumberShortcuts.desc': '开启后,Cmd/Ctrl+[1...9] 仅在终端、工作区、编辑器等可关闭标签页之间切换,不包括固定的 Vault 和 SFTP 标签页。',
|
||
'settings.shortcuts.section.custom': '自定义快捷键',
|
||
'settings.shortcuts.resetAll': '全部重置',
|
||
'settings.shortcuts.recording': '请按键...',
|
||
'settings.shortcuts.none': '无',
|
||
'settings.shortcuts.setDisabled': '设为禁用',
|
||
'settings.shortcuts.category.tabs': '标签页',
|
||
'settings.shortcuts.category.terminal': '终端',
|
||
'settings.shortcuts.category.navigation': '导航',
|
||
'settings.shortcuts.category.app': '应用',
|
||
'settings.shortcuts.category.sftp': 'SFTP',
|
||
'settings.shortcuts.binding.switch-tab-1-9': '切换到标签页 [1...9]',
|
||
'settings.shortcuts.binding.next-tab': '下一个标签页',
|
||
'settings.shortcuts.binding.prev-tab': '上一个标签页',
|
||
'settings.shortcuts.binding.close-tab': '关闭标签页',
|
||
'settings.shortcuts.binding.new-tab': '新建本地标签页',
|
||
'settings.shortcuts.binding.copy': '从终端复制',
|
||
'settings.shortcuts.binding.paste': '粘贴到终端',
|
||
'settings.shortcuts.binding.select-all': '全选终端内容',
|
||
'settings.shortcuts.binding.clear-buffer': '清空终端缓冲区',
|
||
'settings.shortcuts.binding.search-terminal': '打开终端搜索',
|
||
'settings.shortcuts.binding.move-focus': '在分屏间移动焦点',
|
||
'settings.shortcuts.binding.split-horizontal': '水平分屏',
|
||
'settings.shortcuts.binding.split-vertical': '垂直分屏',
|
||
'settings.shortcuts.binding.open-hosts': '打开主机列表',
|
||
'settings.shortcuts.binding.open-local': '打开本地终端',
|
||
'settings.shortcuts.binding.open-sftp': '打开 SFTP',
|
||
'settings.shortcuts.binding.port-forwarding': '打开端口转发',
|
||
'settings.shortcuts.binding.command-palette': '打开命令面板',
|
||
'settings.shortcuts.binding.quick-switch': '快速切换',
|
||
'settings.shortcuts.binding.new-workspace': '新建工作区',
|
||
'settings.shortcuts.binding.snippets': '打开代码片段',
|
||
'settings.shortcuts.binding.broadcast': '切换广播模式',
|
||
'settings.shortcuts.binding.toggle-side-panel': '切换侧边栏',
|
||
'settings.shortcuts.binding.sftp-copy': '复制文件',
|
||
'settings.shortcuts.binding.sftp-cut': '剪切文件',
|
||
'settings.shortcuts.binding.sftp-paste': '粘贴文件',
|
||
'settings.shortcuts.binding.sftp-select-all': '全选文件',
|
||
'settings.shortcuts.binding.sftp-rename': '重命名文件',
|
||
'settings.shortcuts.binding.sftp-delete': '删除文件',
|
||
'settings.shortcuts.binding.sftp-refresh': '刷新',
|
||
'settings.shortcuts.binding.sftp-new-folder': '新建文件夹',
|
||
|
||
// Host Details (sub-panels)
|
||
'hostDetails.proxyPanel.title': '通过 HTTP/SOCKS5/命令代理',
|
||
'hostDetails.proxyPanel.hostPlaceholder': '代理主机',
|
||
'hostDetails.proxyPanel.command': 'ProxyCommand',
|
||
'hostDetails.proxyPanel.commandPlaceholder': 'cloudflared access ssh --hostname %h',
|
||
'hostDetails.proxyPanel.commandHelp': '使用 %h 表示目标主机,%p 表示目标端口,%% 表示字面百分号。',
|
||
'hostDetails.proxyPanel.credentials': '凭据',
|
||
'hostDetails.proxyPanel.usernamePlaceholder': '用户名',
|
||
'hostDetails.proxyPanel.passwordPlaceholder': '密码',
|
||
'hostDetails.proxyPanel.identities': '身份',
|
||
'hostDetails.proxyPanel.remove': '移除代理',
|
||
'hostDetails.proxyPanel.savedProxy': '已保存代理',
|
||
'hostDetails.proxyPanel.selectSaved': '选择已保存代理',
|
||
'hostDetails.proxyPanel.customProxy': '自定义代理',
|
||
'hostDetails.proxyPanel.missing': '缺失',
|
||
'hostDetails.proxyPanel.missingSaved': '保存的代理不存在',
|
||
'hostDetails.proxyPanel.error.required': '代理主机和端口,或 ProxyCommand 不能为空。',
|
||
'hostDetails.envVars.title': '环境变量',
|
||
'hostDetails.envVars.desc': '为 {host} 设置环境变量。',
|
||
'hostDetails.envVars.note': '部分 SSH 服务器默认只允许以 LC_ 和 LANG_ 为前缀的变量。',
|
||
'hostDetails.envVars.variable': '变量',
|
||
'hostDetails.envVars.value': '值',
|
||
'hostDetails.envVars.newVariable': '新变量',
|
||
'hostDetails.envVars.variableName': '变量名',
|
||
'hostDetails.chain.title': '编辑链路',
|
||
'hostDetails.chain.desc': '添加另一台主机将创建到 {host} 的连接。',
|
||
'hostDetails.chain.addHost': '添加主机',
|
||
'hostDetails.chain.target': '目标',
|
||
'hostDetails.chain.availableHosts': '可用主机',
|
||
'hostDetails.chain.clear': '清空',
|
||
'hostDetails.group.title': '新建分组',
|
||
'hostDetails.group.general': '常规',
|
||
'hostDetails.group.namePlaceholder': '分组名称',
|
||
'hostDetails.group.parentPlaceholder': '父分组',
|
||
'hostDetails.group.cloudSync': '云同步',
|
||
'hostDetails.group.addProtocol': '添加协议',
|
||
|
||
// Keychain
|
||
'keychain.filter.key': '密钥',
|
||
'keychain.filter.certificate': '证书',
|
||
'keychain.action.generateKey': '生成密钥',
|
||
'keychain.action.importKey': '导入密钥',
|
||
'keychain.action.newIdentity': '新建身份',
|
||
'keychain.action.importCertificate': '导入证书',
|
||
'keychain.view.grid': '网格',
|
||
'keychain.view.list': '列表',
|
||
'keychain.section.keys': '密钥',
|
||
'keychain.section.identities': '身份',
|
||
'keychain.count.items': '{count} 项',
|
||
'keychain.empty.title': '设置密钥',
|
||
'keychain.empty.desc': '导入或生成 SSH 密钥用于安全认证。',
|
||
'keychain.panel.generateKey': '生成密钥',
|
||
'keychain.panel.newKey': '新建密钥',
|
||
'keychain.panel.keyDetails': '密钥详情',
|
||
'keychain.panel.editKey': '编辑密钥',
|
||
'keychain.panel.editIdentity': '编辑身份',
|
||
'keychain.panel.newIdentity': '新建身份',
|
||
'keychain.panel.keyExport': '密钥导出',
|
||
'keychain.validation.labelRequired': '请填写密钥的 Label',
|
||
'keychain.validation.labelAndPrivateKeyRequired': 'Label 和私钥为必填项',
|
||
'keychain.validation.labelAndUsernameRequired': 'Label 和用户名为必填项',
|
||
'keychain.error.generationUnavailable': '无法生成密钥:请确保应用运行在 Electron 环境',
|
||
'keychain.error.generateKeyPairFailed': '生成密钥对失败',
|
||
'keychain.error.generateKeyFailed': '生成密钥失败',
|
||
'keychain.error.keyGenerationTitle': '密钥生成',
|
||
'keychain.export.exportTo': '导出到 *',
|
||
'keychain.export.selectHost': '选择主机',
|
||
'keychain.export.location': '位置 ~ $1 *',
|
||
'keychain.export.filename': '文件名 ~ $2 *',
|
||
'keychain.export.note': '密钥导出目前仅支持 {unix} 系统。请在 {advanced} 部分自定义导出脚本。',
|
||
'keychain.export.script': '脚本 *',
|
||
'keychain.export.scriptPlaceholder': '导出脚本...',
|
||
'keychain.export.missingCredentials': '主机未保存密码或密钥。请先为该主机添加密码凭据。',
|
||
'keychain.export.successTitle': '导出成功',
|
||
'keychain.export.successMessage': '已导出公钥并绑定到 {host}',
|
||
'keychain.export.failedTitle': '导出失败',
|
||
'keychain.export.failedMessage': '导出密钥失败:{error}',
|
||
'keychain.export.failedPrefix': '导出失败:{error}',
|
||
'keychain.export.exitCode': '命令退出码 {code}',
|
||
'keychain.export.exporting': '导出中...',
|
||
'keychain.export.exportAndAttach': '导出并绑定',
|
||
'keychain.export.title': '密钥导出',
|
||
'keychain.export.exportToRequired': '导出到 *',
|
||
'keychain.export.selectHostPlaceholder': '选择主机...',
|
||
'keychain.export.locationLabel': '位置 ~ $1 *',
|
||
'keychain.export.filenameLabel': '文件名 ~ $2 *',
|
||
'keychain.export.advanced': '高级',
|
||
'keychain.export.note.supportsOnly': '密钥导出目前仅支持',
|
||
'keychain.export.note.systems': '系统。',
|
||
'keychain.export.note.use': '请使用',
|
||
'keychain.export.note.customize': '部分自定义导出脚本。',
|
||
'keychain.export.scriptRequired': '脚本 *',
|
||
'keychain.export.exportToHost': '导出到主机',
|
||
'keychain.export.failedGeneric': '导出失败:{message}',
|
||
'keychain.field.label': 'Label',
|
||
'keychain.field.labelRequired': 'Label *',
|
||
'keychain.field.labelPlaceholder': '密钥 Label',
|
||
'keychain.field.privateKeyRequired': '私钥 *',
|
||
'keychain.field.publicKey': '公钥',
|
||
'keychain.field.certificatePlaceholder': '证书内容(可选)',
|
||
'keychain.generate.keyType': '密钥类型',
|
||
'keychain.generate.keySize': '密钥长度',
|
||
'keychain.generate.labelPlaceholder': '密钥 Label',
|
||
'keychain.generate.passphrasePlaceholder': 'Passphrase(可选)',
|
||
'keychain.generate.savePassphrase': '保存 Passphrase',
|
||
'keychain.generate.generate': '生成',
|
||
'keychain.generate.generateSave': '生成并保存',
|
||
'keychain.import.dropHint': '将密钥文件拖到这里',
|
||
'keychain.import.importFromFile': '从文件导入',
|
||
'keychain.import.saveKey': '保存密钥',
|
||
'keychain.import.importedKeyLabel': '已导入密钥',
|
||
'keychain.identity.usernameRequired': '用户名 *',
|
||
'keychain.identity.method.passwordOnly': '密码',
|
||
'keychain.identity.summary.password': '认证密码',
|
||
'keychain.identity.summary.key': '认证密钥',
|
||
'keychain.identity.summary.certificate': '认证证书',
|
||
'keychain.identity.summary.passwordAndKey': '认证密码与密钥',
|
||
'keychain.identity.summary.passwordAndCertificate': '认证密码与证书',
|
||
'keychain.identity.summary.none': '无凭据',
|
||
'keychain.identity.selectCredential': '选择{kind}',
|
||
'keychain.identity.save': '保存',
|
||
'keychain.identity.update': '更新',
|
||
'keychain.keyDialog.newTitle': '新建密钥',
|
||
'keychain.keyDialog.newDesc': '添加新的 SSH 密钥',
|
||
'keychain.keyDialog.editTitle': '编辑密钥',
|
||
'keychain.keyDialog.editDesc': '更新此 SSH 密钥',
|
||
'keychain.keyDialog.updateKey': '更新密钥',
|
||
|
||
// Tabs
|
||
'tabs.closeSessionAria': '关闭会话',
|
||
'tabs.closeLogViewAria': '关闭日志视图',
|
||
'tabs.logPrefix': '日志:',
|
||
'tabs.logLocal': '本地',
|
||
'tabs.copyTab': '复制标签页',
|
||
'tabs.copyTabToNewWindow': '复制标签页到新窗口',
|
||
'tabs.copyTabToNewWindowFailed': '无法在新窗口打开标签页',
|
||
'tabs.closeOthers': '关闭其他标签',
|
||
'tabs.closeToRight': '关闭右侧标签',
|
||
'tabs.closeAll': '关闭所有标签',
|
||
'keychain.edit.labelRequired': 'Label *',
|
||
'keychain.edit.keyLabelPlaceholder': '密钥 Label',
|
||
'keychain.edit.privateKeyRequired': '私钥 *',
|
||
'keychain.edit.publicKey': '公钥',
|
||
'keychain.edit.certificate': '证书',
|
||
'keychain.edit.certificatePlaceholder': '证书内容(可选)',
|
||
'keychain.edit.filePath': '文件路径',
|
||
'keychain.edit.keyExport': '密钥导出',
|
||
'keychain.edit.exportToHost': '导出到主机',
|
||
|
||
// Snippets
|
||
'snippets.searchPlaceholder': '搜索代码片段...',
|
||
'snippets.action.newSnippet': '新建代码片段',
|
||
'snippets.action.newPackage': '新建代码包',
|
||
'snippets.panel.newTitle': '新建代码片段',
|
||
'snippets.panel.editTitle': '编辑代码片段',
|
||
'snippets.field.description': '描述',
|
||
'snippets.field.descriptionPlaceholder': '例如:check network load',
|
||
'snippets.field.package': '添加代码包',
|
||
'snippets.field.packagePlaceholder': '选择或创建代码包',
|
||
'snippets.field.createPackage': '创建代码包',
|
||
'snippets.field.scriptRequired': '脚本 *',
|
||
'snippets.scriptEditor.expand': '弹窗编辑',
|
||
'snippets.scriptEditor.resize': '调整编辑器高度',
|
||
'snippets.scriptEditor.modalTitle': '编辑脚本',
|
||
'snippets.targets.title': '目标主机',
|
||
'snippets.targets.add': '添加目标主机',
|
||
'snippets.history.title': 'Shell 历史',
|
||
'snippets.history.subtitle': '{count} 条命令',
|
||
'snippets.history.emptyTitle': '暂无 Shell 历史',
|
||
'snippets.history.emptyDesc': '你执行过的命令会显示在这里',
|
||
'snippets.history.loadMore': '加载更多',
|
||
'snippets.history.separator': '•',
|
||
'snippets.history.labelPlaceholder': '为此代码片段设置一个 Label',
|
||
'snippets.history.saveAsSnippet': '保存为代码片段',
|
||
'snippets.history.time.justNow': '刚刚',
|
||
'snippets.history.time.minutesAgo': '{count} 分钟前',
|
||
'snippets.history.time.hoursAgo': '{count} 小时前',
|
||
'snippets.history.time.daysAgo': '{count} 天前',
|
||
'snippets.breadcrumb.allPackages': '全部代码包',
|
||
'snippets.breadcrumb.separator': '›',
|
||
'snippets.empty.title': '创建代码片段',
|
||
'snippets.empty.desc': '将常用命令保存为代码片段,一键复用。',
|
||
'snippets.search.noResults.title': '无匹配结果',
|
||
'snippets.search.noResults.desc': '没有代码片段或代码包与"{query}"匹配。换一个关键字,或清除搜索进行浏览。',
|
||
'snippets.section.packages': '代码包',
|
||
'snippets.section.snippets': '代码片段',
|
||
'snippets.package.count': '{count} 个代码片段',
|
||
'snippets.commandFallback': '命令',
|
||
'snippets.view.grid': '网格',
|
||
'snippets.view.list': '列表',
|
||
'snippets.packageDialog.title': '新建代码包',
|
||
'snippets.packageDialog.parent': '父级:{parent}',
|
||
'snippets.packageDialog.root': '根目录',
|
||
'snippets.packageDialog.placeholder': '例如:ops/maintenance',
|
||
'snippets.packageDialog.hint': '使用 "/" 创建嵌套代码包。',
|
||
|
||
// Snippets Rename Dialog
|
||
'snippets.renameDialog.title': '重命名代码包',
|
||
'snippets.renameDialog.currentPath': '当前路径:{path}',
|
||
'snippets.renameDialog.placeholder': '输入新名称',
|
||
'snippets.renameDialog.error.empty': '代码包名称不能为空',
|
||
'snippets.renameDialog.error.duplicate': '已存在同名的代码包',
|
||
'snippets.renameDialog.error.invalidChars': '代码包名称只能包含字母、数字、连字符和下划线',
|
||
|
||
'snippets.field.noAutoRun': '仅粘贴(不自动执行)',
|
||
// Snippet Shortkey
|
||
'snippets.field.shortkey': '快捷键',
|
||
'snippets.shortkey.placeholder': '点击设置快捷键',
|
||
'snippets.shortkey.recording': '请按下快捷键组合...',
|
||
'snippets.shortkey.hint': '在终端中按下此快捷键可快速发送命令。',
|
||
'snippets.shortkey.clear': '清除快捷键',
|
||
'snippets.shortkey.error.systemConflict': '此快捷键与系统快捷键冲突',
|
||
'snippets.shortkey.error.snippetConflict': '此快捷键已被代码片段使用:{name}',
|
||
|
||
'snippets.variables.dialogTitle': '填写变量',
|
||
'snippets.variables.dialogDesc': '运行「{label}」前请填写以下变量。',
|
||
'snippets.variables.hint': '变量值将原样插入脚本(不会进行 shell 转义)。',
|
||
'snippets.variables.preview': '预览',
|
||
'snippets.variables.placeholder': '请输入',
|
||
'snippets.variables.placeholderDefault': '默认:{value}',
|
||
'snippets.variables.required': '请填写此变量',
|
||
'snippets.variables.run': '运行',
|
||
'snippets.field.variablesHelp': '在脚本中使用 {{名称}} 或 {{名称:默认值}} 定义变量。',
|
||
'snippets.field.variablesDetected': '变量',
|
||
'snippets.field.variableDefault': '默认 {value}',
|
||
|
||
// Serial Port
|
||
'serial.button': '串口',
|
||
'serial.modal.title': '连接串口',
|
||
'serial.modal.desc': '配置串口连接参数',
|
||
'serial.field.port': '串口',
|
||
'serial.field.selectPort': '选择串口...',
|
||
'serial.field.baudRate': '波特率',
|
||
'serial.field.dataBits': '数据位',
|
||
'serial.field.stopBits': '停止位',
|
||
'serial.field.stopBits15Warning': '1.5 停止位在 Windows 下可能不被所有设备支持',
|
||
'serial.field.parity': '校验位',
|
||
'serial.field.flowControl': '流控制',
|
||
'serial.noPorts': '未检测到串口设备。请连接设备后刷新。',
|
||
'serial.field.customPort': '自定义串口路径',
|
||
'serial.field.customPortPlaceholder': '例如 /dev/ttys001 或 COM1',
|
||
'serial.type.hardware': '硬件',
|
||
'serial.type.pseudo': '虚拟终端',
|
||
'serial.type.custom': '自定义',
|
||
'serial.parity.none': '无',
|
||
'serial.parity.even': '偶校验',
|
||
'serial.parity.odd': '奇校验',
|
||
'serial.parity.mark': 'Mark',
|
||
'serial.parity.space': 'Space',
|
||
'serial.flowControl.none': '无',
|
||
'serial.flowControl.xon/xoff': 'XON/XOFF (软件)',
|
||
'serial.flowControl.rts/cts': 'RTS/CTS (硬件)',
|
||
'serial.field.localEcho': '强制本地回显',
|
||
'serial.field.localEchoDesc': '本地回显输入字符(用于没有远程回显的设备)',
|
||
'serial.field.lineMode': '行模式',
|
||
'serial.field.lineModeDesc': '缓冲输入,按回车后发送(而不是逐字符发送)',
|
||
'serial.field.charset': '字符编码',
|
||
'serial.connectionError': '连接串口失败',
|
||
'serial.field.baudRatePlaceholder': '选择或输入波特率...',
|
||
'serial.field.baudRateEmpty': '输入自定义波特率',
|
||
'serial.field.customBaudRate': '使用自定义波特率',
|
||
'serial.field.saveConfig': '保存配置',
|
||
'serial.field.saveConfigDesc': '将此串口配置保存到主机列表以便快速访问',
|
||
'serial.field.configLabel': '配置名称',
|
||
'serial.field.configLabelPlaceholder': '例如 Arduino Uno',
|
||
'serial.connectAndSave': '连接并保存',
|
||
'serial.edit.title': '串口设置',
|
||
|
||
// Keyboard Interactive Authentication (2FA/MFA)
|
||
'keyboard.interactive.title': '需要验证',
|
||
'keyboard.interactive.desc': '服务器需要额外的身份验证。',
|
||
'keyboard.interactive.descWithHost': '服务器 {hostname} 需要额外的身份验证。',
|
||
'keyboard.interactive.response': '响应',
|
||
'keyboard.interactive.enterCode': '输入验证码',
|
||
'keyboard.interactive.enterResponse': '输入响应',
|
||
'keyboard.interactive.submit': '提交',
|
||
'keyboard.interactive.verifying': '验证中...',
|
||
'keyboard.interactive.savePassword': '保存密码',
|
||
|
||
// Passphrase Modal for encrypted SSH keys
|
||
'passphrase.title': 'SSH 密钥密码',
|
||
'passphrase.desc': '请输入 {keyName} 的密码',
|
||
'passphrase.descWithHost': '请输入 {keyName} 的密码以连接到 {hostname}',
|
||
'passphrase.label': '密码',
|
||
'passphrase.keyPath': '密钥',
|
||
'passphrase.unlock': '解锁',
|
||
'passphrase.unlocking': '解锁中...',
|
||
'passphrase.skip': '跳过',
|
||
'passphrase.remember': '记住此密码',
|
||
|
||
// Text Editor
|
||
'sftp.editor.wordWrap': '自动换行',
|
||
'sftp.editor.maximize': '最大化',
|
||
'sftp.editor.unsavedTitle': '未保存的修改',
|
||
'sftp.editor.unsavedMessage': '{fileName} 有未保存的修改,是否保存后关闭?',
|
||
'sftp.editor.discardChanges': '不保存',
|
||
'sftp.editor.saveAndClose': '保存并关闭',
|
||
'sftp.editor.quitBlockedByDirty': '存在未保存的编辑器,请先处理后再退出',
|
||
|
||
};
|