* Add terminals to workspace + New Workspace from QuickSwitcher
Two entry points share a single multi-select picker that lets the
user add Local Terminal + any combination of hosts into a workspace:
1. Focus-mode sidebar "+" button appends the selected targets to the
active workspace as new panes.
2. QuickSwitcher "New Workspace" button (small inline action next to
the Jump To hint) spins up a brand-new workspace tab populated
with the selected targets.
## Changes
### domain/workspace.ts
- pruneWorkspaceNode now rebalances surviving siblings to EQUAL
sizes after removal, instead of re-normalising the prior skew.
Matches the "auto-redistribute on close" expectation.
- New appendPaneToWorkspaceRoot(root, sessionId, direction='vertical'):
if root already splits in the requested direction, pushes the new
pane onto its children and resets sizes to equal; otherwise wraps
root + new pane in a new 0.5/0.5 split. Flattens long chains of
appends instead of producing degenerate nested trees.
### application/state/useSessionState.ts
- appendHostToWorkspace(workspaceId, host, direction?) — atomic
"build a session for this host and append it to the root", keeps
activeTab on the workspace and focuses the new pane.
- appendLocalTerminalToWorkspace(workspaceId, options?, direction?)
— mirror of the above for local shells.
- createWorkspaceFromTargets(targets, name?) — accepts a mixed list
of {kind:'local',...} / {kind:'host',host} and creates a new
workspace with one pane per target. Defaults viewMode to 'focus'
so the QuickSwitcher flow lands in the sidebar layout.
- All three exported from the hook.
### components/workspace/AddToWorkspaceDialog.tsx (new)
QuickSwitcher-styled multi-select picker:
- Fixed top-center overlay, same chrome as QuickSwitcher (border,
shadow, rounded-xl, borderless search input, bg-primary/15 cursor).
- Two sections: Local Shells (currently just Local Terminal) and
Hosts. Hover follows keyboard cursor.
- Toggle rows with click or Space / Enter; ⌘/Ctrl+Enter submits;
Esc closes. Right-side Check marks visible items.
- Thin footer bar with Cancel + "Add N" button.
### App.tsx
- Root-mounted single instance of AddToWorkspaceDialog with a
discriminated-union state:
{ mode: 'append'; workspaceId } | { mode: 'create' } | null.
- onAdd dispatches based on mode — append loops through the picker
targets calling the two append helpers; create calls
createWorkspaceFromTargets once.
- TerminalLayer's focus "+" now sends an onRequestAddToWorkspace
(workspaceId) up to App instead of owning its own dialog.
- QuickSwitcher's onCreateWorkspace callback repurposed to open the
dialog in create mode (replaces the older CreateWorkspaceDialog
route for this specific flow).
### components/TerminalLayer.tsx
- Dropped the inline AddToWorkspaceDialog + addHostPanelOpen state;
replaced the two append callbacks with a single
onRequestAddToWorkspace prop wired to the "+" button.
- Focus-sidebar header: replaced the "Terminals · N" counter with an
immersive borderless search input (bg-transparent, shadow-none,
termFg color) for filtering the terminal list; "+" and Columns2
buttons moved to the right.
- Session list filtered client-side by the search term across
hostLabel / hostname / username.
### components/QuickSwitcher.tsx
- Re-introduced onCreateWorkspace prop (was removed as unused).
- "New Workspace" inline button (Plus icon + label) sits on the
right of the Jump To hint row: border, rounded, hover bg. Click
fires onCreateWorkspace then closes QS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Add configurable New Workspace shortcut
Mirrors QuickSwitcher's "+ New Workspace" button via a keyboard
binding so the dialog can open in one keystroke without passing
through QS.
- domain/models.ts: new DEFAULT_KEY_BINDINGS entry id=new-workspace,
action=newWorkspace, default ⌘+Shift+J (Mac) / Ctrl+Shift+J (PC).
Audited the defaults — only quick-switch uses J (⌘+J), so the
shifted combo is free. The binding sits in the 'app' category so
it shows up in Settings → Shortcuts and can be rebound by the user.
- application/state/useGlobalHotkeys.ts: wire newWorkspace into the
HotkeyActions interface, getAppLevelActions() allowlist, and the
global keydown switch so the scheme-driven handler dispatches it.
- App.tsx: handle case 'newWorkspace' inside executeHotkeyAction by
calling setAddToWorkspaceDialog({ mode: 'create' }) — same entry
as QuickSwitcher's button, just without having to open QS first.
- application/i18n/locales/zh-CN.ts: add '新建工作区' translation for
settings.shortcuts.binding.new-workspace. English falls back to
the KeyBinding.label field ("New Workspace"), so no en.ts change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Address codex P1: don't check setState flag after the updater returns
Codex flagged that appendHostToWorkspace / appendLocalTerminalToWorkspace
were racy: both flipped an `inserted` flag inside setWorkspaces'
updater and then read it synchronously to decide whether to commit
the matching session via setSessions. React does NOT guarantee
updaters run synchronously (concurrent rendering, StrictMode
double-invoke, etc.), so the flag could still be false at the read
site even though the workspace exists. In that case setSessions was
skipped while the queued workspace update could still insert a new
pane referencing newSessionId — leaving a pane with no backing
session in state.
Fix: add a workspacesRef kept in sync with the workspaces state on
every render, and perform the existence check synchronously *before*
queuing any setState. Once we've confirmed the workspace exists on
the latest committed state, both setWorkspaces and setSessions are
called unconditionally, so they can never diverge.
The ref approach also correctly handles the multi-target append
loop path — React batches the updaters and applies them in sequence,
so sibling pane/session writes land in matching order.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Address codex P1+P2: narrow prune rebalance; append in root direction
### P1 — pruneWorkspaceNode over-rebalanced ancestor splits
The equal-sizes rebalance was unconditional during the recursive
walk, so closing a pane deep in one branch also rewrote unrelated
ancestor ratios (e.g., a root 0.8/0.2 vertical split got normalised
to 0.5/0.5 when a grand-child horizontal pane closed).
Now each split level tracks whether it actually lost a DIRECT
child. Only splits where a direct child disappeared get their
siblings reset to equal sizes. Ancestors whose direct children all
survived keep their original ratios (defensively re-normalised in
case a descendant subtree collapsed shape).
### P2 — Append path ignored the root's current direction
onAdd in App.tsx called the two append helpers without a direction,
so both defaulted to 'vertical'. appendPaneToWorkspaceRoot only
flattens into the root split when the directions match; if the
workspace root was horizontal (e.g., user split top/bottom earlier),
each append wrapped the entire existing tree into one side of a new
vertical split — existing panes crammed into one branch, new pane
hoarding half the space.
Read the current root direction out of the target workspace and
pass it down so new panes become peers of the existing root
siblings regardless of horizontal vs vertical.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Address codex P2: allow serial hosts in create-workspace picker
The picker used to filter out every host with protocol='serial'
regardless of mode. That was correct for append mode (the
appendHostToWorkspace helper has no serial path and early-returns)
but a regression for create mode — the old createWorkspaceWithHosts
flow passed serial hosts through and createWorkspaceFromTargets
still builds a SerialConfig-backed session for them, so there was
no reason to block them in the "+ New Workspace" entry.
Move the filter from the dialog up to App.tsx:
- AddToWorkspaceDialog drops the serial filter; selectableHosts is
simply the hosts prop.
- App.tsx passes `hosts.filter(h => h.protocol !== 'serial')` when
mode is 'append', and the full list when mode is 'create'.
Result: users can once again build a workspace from serial hosts
via QuickSwitcher's "+ New Workspace" button or the ⌘/Ctrl+Shift+J
hotkey, while append-to-existing keeps its earlier safe behaviour.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Address codex P2: don't commit session when append target disappears
Follow-up to the earlier ref-based guard. The ref check eliminates
the common "workspace already gone" case but still leaves a small
race: if closeWorkspace runs between the ref read and setWorkspaces'
updater firing, prev.map returns the unchanged workspaces but
setSessions / setActiveTabId still execute — leaving an orphan
session whose workspaceId points at a deleted workspace and jumping
activeTabId to a closed tab.
Nest setSessions + setActiveTabId inside the setWorkspaces updater
so the writes are gated on the same authoritative match used for
the tree update. The setSessions updater also de-dupes by newSessionId
so React 18 StrictMode's dev-time double-invoke of the outer updater
doesn't append the same row twice. Same pattern applied to
appendLocalTerminalToWorkspace.
The existing closeSession already uses the nested-setState shape, so
this matches the codebase convention.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1986 lines
108 KiB
TypeScript
1986 lines
108 KiB
TypeScript
import type { Messages } from './en';
|
||
|
||
const zhCN: Messages = {
|
||
// Common
|
||
'common.save': '保存',
|
||
'common.cancel': '取消',
|
||
'common.close': '关闭',
|
||
'common.reset': '重置',
|
||
'common.zoomIn': '放大',
|
||
'common.zoomOut': '缩小',
|
||
'common.settings': '设置',
|
||
'common.search': '搜索',
|
||
'common.connect': '连接',
|
||
'common.terminal': '终端',
|
||
'common.create': '创建',
|
||
'common.add': '添加',
|
||
'common.rename': '重命名',
|
||
'common.refresh': '刷新',
|
||
'common.continue': '继续',
|
||
'common.enabled': '已启用',
|
||
'common.disabled': '已禁用',
|
||
'common.unknownError': '未知错误',
|
||
'common.noResultsFound': '没有匹配结果',
|
||
'common.back': '返回',
|
||
'common.apply': '应用',
|
||
'common.use': '使用',
|
||
'common.useGlobal': '跟随全局',
|
||
'common.left': '左侧',
|
||
'common.right': '右侧',
|
||
'common.more': '更多',
|
||
'common.selectAHost': '选择主机',
|
||
'sort.az': 'A-z',
|
||
'sort.za': 'Z-a',
|
||
'sort.newest': '从新到旧',
|
||
'sort.oldest': '从旧到新',
|
||
'sort.group': '按分组',
|
||
'field.label': 'Label',
|
||
'field.type': '类型',
|
||
'auth.keyType': '类型 {type}',
|
||
'auth.showAllKeys': '显示全部 keys',
|
||
|
||
// Dialogs / prompts
|
||
'confirm.deleteHost': '删除主机 "{name}"?',
|
||
'confirm.deleteIdentity': '删除身份 "{name}"?',
|
||
'confirm.removeProvider': '移除提供商 "{name}"?',
|
||
'confirm.closeBusyTerminal.title': '确认关闭',
|
||
'confirm.closeBusyTerminal.message': '进程 "{command}" 仍在运行,关闭后会被终止。',
|
||
'confirm.closeBusyTerminal.messageWithMore': '进程 "{command}" 及其他 {count} 个正在运行的进程将被终止。',
|
||
'confirm.closeBusyTerminal.cancel': '取消',
|
||
'confirm.closeBusyTerminal.close': '关闭',
|
||
'dialog.renameWorkspace.title': '重命名工作区',
|
||
'dialog.renameSession.title': '重命名会话',
|
||
'field.name': '名称',
|
||
'placeholder.workspaceName': '工作区名称',
|
||
'placeholder.sessionName': '会话名称',
|
||
'toast.settingsUnavailable': '当前平台无法打开设置窗口。',
|
||
'credentials.protectionUnavailable.title': '凭据保护不可用',
|
||
'credentials.protectionUnavailable.message': '当前设备无法自动解密已保存的密码和密钥。连接前请重新输入凭据。',
|
||
'credentials.protectionUnavailable.action': '打开设置',
|
||
|
||
// Settings shell
|
||
'settings.title': '设置',
|
||
'settings.tab.application': '应用',
|
||
'settings.tab.appearance': '外观',
|
||
'settings.tab.terminal': '终端',
|
||
'settings.tab.shortcuts': '快捷键',
|
||
'settings.tab.syncCloud': '同步与云',
|
||
'settings.tab.system': '系统',
|
||
|
||
// Settings > System
|
||
'settings.system.title': '系统',
|
||
'settings.system.description': '系统信息与临时文件管理。',
|
||
'settings.system.tempDirectory': '临时文件',
|
||
'settings.system.location': '位置',
|
||
'settings.system.fileCount': '文件数量',
|
||
'settings.system.totalSize': '占用空间',
|
||
'settings.system.openFolder': '打开文件夹',
|
||
'settings.system.refresh': '刷新',
|
||
'settings.system.clearTempFiles': '清理临时文件',
|
||
'settings.system.clearing': '清理中...',
|
||
'settings.system.clearResult': '已删除 {deleted} 个文件,{failed} 个失败。',
|
||
'settings.system.tempDirectoryHint': '临时文件在使用外部应用打开远程文件时创建。SFTP 会话关闭时会自动清理。',
|
||
'settings.system.credentials.title': '凭据保护',
|
||
'settings.system.credentials.status': '状态',
|
||
'settings.system.credentials.checking': '检查中...',
|
||
'settings.system.credentials.available': '可用(系统钥匙串正常)',
|
||
'settings.system.credentials.unavailable': '不可用(无法解密已保存凭据)',
|
||
'settings.system.credentials.unknown': '未知(当前环境不支持)',
|
||
'settings.system.credentials.unavailableHint': '在其他用户或机器上加密的凭据无法在此处解密。请在当前设备重新输入并保存凭据。',
|
||
'settings.system.credentials.portabilityHint': '云同步可跨设备,因为使用主密钥加密;本地 safeStorage 加密仅绑定当前系统用户/设备。',
|
||
|
||
// Settings > System > Crash Logs
|
||
'settings.system.crashLogs.title': '崩溃日志',
|
||
'settings.system.crashLogs.description': '查看主进程错误日志,帮助诊断异常行为。',
|
||
'settings.system.crashLogs.noLogs': '未找到崩溃日志。',
|
||
'settings.system.crashLogs.entries': '{count} 条记录',
|
||
'settings.system.crashLogs.clear': '清除所有日志',
|
||
'settings.system.crashLogs.cleared': '已清除 {count} 个日志文件。',
|
||
'settings.system.crashLogs.source': '来源',
|
||
'settings.system.crashLogs.time': '时间',
|
||
'settings.system.crashLogs.message': '消息',
|
||
'settings.system.crashLogs.stack': '堆栈跟踪',
|
||
'settings.system.crashLogs.hint': '崩溃日志保留 30 天,超期自动清理。',
|
||
'settings.system.crashLogs.collapse': '收起',
|
||
'settings.system.crashLogs.expand': '查看详情',
|
||
|
||
// Settings > System > Software Update
|
||
'settings.update.title': '软件更新',
|
||
'settings.update.currentVersion': '当前版本',
|
||
'settings.update.checkForUpdates': '检查更新',
|
||
'settings.update.checking': '检查中...',
|
||
'settings.update.upToDate': '当前已是最新版本。',
|
||
'settings.update.available': '新版本 {version} 已发布。',
|
||
'settings.update.download': '下载更新',
|
||
'settings.update.downloading': '正在下载... {percent}%',
|
||
'settings.update.readyToInstall': '更新已下载,准备安装。',
|
||
'settings.update.restartNow': '重启并更新',
|
||
'settings.update.error': '检查更新失败。',
|
||
'settings.update.downloadError': '下载失败。',
|
||
'settings.update.manualDownload': '前往 GitHub 下载',
|
||
'settings.update.manualDownloadHint': '当前平台不支持自动更新,请前往 GitHub 下载最新版本。',
|
||
'settings.update.hint': 'Netcatty 从 GitHub Releases 检查更新。',
|
||
'settings.update.lastCheckedJustNow': '刚刚',
|
||
'settings.update.lastCheckedMinutesAgo': '{n} 分钟前',
|
||
'settings.update.lastCheckedHoursAgo': '{n} 小时前',
|
||
'settings.update.lastCheckedPrefix': '上次检查:',
|
||
'settings.update.autoUpdateEnabled': '自动更新',
|
||
'settings.update.autoUpdateEnabledDesc': '有新版本时自动检查并下载更新。',
|
||
|
||
// Settings > Session Logs
|
||
'settings.sessionLogs.title': '会话日志',
|
||
'settings.sessionLogs.description': '配置会话日志导出和自动保存设置。',
|
||
'settings.sessionLogs.autoSave': '自动保存',
|
||
'settings.sessionLogs.enableAutoSave': '启用自动保存',
|
||
'settings.sessionLogs.enableAutoSaveDesc': '在终端会话结束时自动保存会话日志。',
|
||
'settings.sessionLogs.directory': '保存目录',
|
||
'settings.sessionLogs.noDirectory': '未选择目录',
|
||
'settings.sessionLogs.browse': '浏览',
|
||
'settings.sessionLogs.openFolder': '打开文件夹',
|
||
'settings.sessionLogs.directoryHint': '日志将按主机名组织在子目录中。',
|
||
'settings.sessionLogs.format': '日志格式',
|
||
'settings.sessionLogs.formatDesc': '选择保存日志文件的格式。',
|
||
'settings.sessionLogs.formatTxt': '纯文本 (.txt)',
|
||
'settings.sessionLogs.formatRaw': '原始格式 (.log)',
|
||
'settings.sessionLogs.formatHtml': 'HTML (.html)',
|
||
'settings.sessionLogs.hint': '会话日志用于记录终端输出,便于故障排查和审计。',
|
||
|
||
// Settings > Global Hotkey (Quake Mode)
|
||
'settings.globalHotkey.title': '全局快捷键',
|
||
'settings.globalHotkey.toggleWindow': '切换窗口',
|
||
'settings.globalHotkey.toggleWindowDesc': '按下组合键以设置显示/隐藏窗口的全局快捷键。',
|
||
'settings.globalHotkey.notSet': '未设置',
|
||
'settings.globalHotkey.reset': '恢复默认',
|
||
'settings.globalHotkey.closeToTray': '关闭时最小化到托盘',
|
||
'settings.globalHotkey.closeToTrayDesc': '启用后,关闭窗口将最小化到系统托盘而不是退出程序。',
|
||
'settings.globalHotkey.enabled': '启用全局快捷键',
|
||
'settings.globalHotkey.enabledDesc': '注册系统级键盘快捷键。禁用后将取消所有全局快捷键注册。',
|
||
'settings.globalHotkey.hint': '全局快捷键在系统范围内工作,可快速显示或隐藏窗口(下拉式终端风格)。',
|
||
|
||
// Tray Panel
|
||
'tray.openMainWindow': '打开主窗口',
|
||
'tray.sessions': '会话',
|
||
'tray.portForwarding': '端口转发',
|
||
'tray.status.connected': '已连接',
|
||
'tray.status.connecting': '连接中',
|
||
'tray.status.disconnected': '已断开',
|
||
'tray.status.active': '已启用',
|
||
'tray.status.inactive': '未启用',
|
||
'tray.status.error': '错误',
|
||
'tray.recentHosts': '最近连接的主机',
|
||
'tray.empty.title': '一切都很安静',
|
||
'tray.empty.subtitle': '去连接个服务器吧,它们想念你了 🚀',
|
||
'tray.quit': '退出 Netcatty',
|
||
|
||
// Vault Sidebar
|
||
'vault.sidebar.collapse': '收起侧边栏',
|
||
'vault.sidebar.expand': '展开侧边栏',
|
||
|
||
// Settings > Application
|
||
'settings.application.checkUpdates': '检查更新',
|
||
'settings.application.reportProblem': '反馈问题',
|
||
'settings.application.reportProblem.subtitle': '生成预填的 GitHub issue',
|
||
'settings.application.community': '社区',
|
||
'settings.application.community.subtitle': 'GitHub Discussions',
|
||
'settings.application.github': 'GitHub',
|
||
'settings.application.github.subtitle': '源代码',
|
||
'settings.application.whatsNew': '更新内容',
|
||
'settings.application.whatsNew.subtitle': '查看发布说明',
|
||
'settings.application.openExternal.failedTitle': '无法打开链接',
|
||
'settings.application.openExternal.failedBody': '系统浏览器和内置浏览器窗口都无法打开该链接。',
|
||
'settings.vault.title': '主机库',
|
||
'settings.vault.showRecentHosts': '显示最近连接的主机',
|
||
'settings.vault.showRecentHostsDesc': '在主机列表顶部显示最近连接过的主机',
|
||
'settings.vault.showOnlyUngroupedHostsInRoot': '根目录只显示未分组主机',
|
||
'settings.vault.showOnlyUngroupedHostsInRootDesc': '开启后,主机库根目录的主机列表只显示没有分组的主机,已分组主机请从左侧分组进入查看。',
|
||
'settings.vault.showSftpTab': '显示 SFTP 标签页',
|
||
'settings.vault.showSftpTabDesc': '在顶部标签栏显示独立的 SFTP 视图。关闭后可改用会话内左侧的 SFTP 侧栏。',
|
||
|
||
// Update notifications
|
||
'update.available.title': '发现新版本',
|
||
'update.available.message': '新版本 {version} 已发布,点击前往下载。',
|
||
'update.checking': '正在检查更新...',
|
||
'update.upToDate.title': '已是最新版本',
|
||
'update.upToDate.message': '当前版本 ({version}) 已是最新。',
|
||
'update.error': '检查更新失败',
|
||
'update.downloadNow': '立即下载',
|
||
'update.viewInSettings': '在设置中查看',
|
||
'update.readyToInstall.title': '更新已就绪',
|
||
'update.readyToInstall.message': '版本 {version} 已下载完成,准备安装。',
|
||
'update.restartNow': '立即重启',
|
||
'update.downloadFailed.title': '更新失败',
|
||
'update.downloadFailed.message': '下载更新失败,可前往 GitHub 手动下载。',
|
||
'update.openReleases': '打开 Releases',
|
||
'update.remindLater': '稍后提醒',
|
||
'update.skipVersion': '跳过此版本',
|
||
|
||
// Settings > Appearance
|
||
'settings.appearance.uiTheme': '界面主题',
|
||
'settings.appearance.theme': '主题',
|
||
'settings.appearance.theme.desc': '选择浅色、深色或跟随系统设置',
|
||
'settings.appearance.theme.light': '浅色',
|
||
'settings.appearance.theme.dark': '深色',
|
||
'settings.appearance.theme.system': '系统',
|
||
'settings.appearance.accentColor': '强调色',
|
||
'settings.appearance.customColor': '自定义颜色',
|
||
'settings.appearance.accentColor.mode': '使用自定义强调色',
|
||
'settings.appearance.accentColor.mode.desc': '覆盖主题自带的强调色',
|
||
'settings.appearance.accentColor.custom': '自定义强调色',
|
||
'settings.appearance.themeColor': '主题色',
|
||
'settings.appearance.themeColor.desc': '为浅色与深色主题选择预设配色',
|
||
'settings.appearance.themeColor.light': '浅色主题',
|
||
'settings.appearance.themeColor.dark': '深色主题',
|
||
'settings.appearance.customCss': '自定义 CSS',
|
||
'settings.appearance.customCss.desc':
|
||
'使用自定义 CSS 个性化界面,修改会立即生效。主要 UI 区块都暴露了 [data-section="..."] 属性供你定位,比如:snippets-panel、host-details-panel、group-details-panel、serial-host-details-panel、ai-chat-panel、vault-sidebar、vault-main、vault-hosts-header、vault-host-list、vault-view、terminal-workspace、terminal-workspace-sidebar、top-tabs。',
|
||
'settings.appearance.customCss.placeholder':
|
||
'/* 示例 — 由于 Tailwind 优先级较高,需要使用 !important */\n\n/* 放大代码片段侧边栏字号 */\n[data-section="snippets-panel"] {\n font-size: 14px !important;\n}\n\n/* 自定义终端背景色 */\n.terminal { background: #1a1a2e !important; }\n\n/* 调整全局圆角 */\n:root { --radius: 0.25rem; }',
|
||
'settings.appearance.language': '语言',
|
||
'settings.appearance.language.desc': '选择界面语言',
|
||
'settings.appearance.uiFont': '界面字体',
|
||
'settings.appearance.uiFont.desc': '选择软件界面使用的字体',
|
||
|
||
// Context menus / common actions
|
||
'action.newHost': '新建主机',
|
||
'action.newSubfolder': '新建文件夹',
|
||
'action.copyPublicKey': '复制公钥',
|
||
'action.keyExport': '导出密钥',
|
||
'action.edit': '编辑',
|
||
'action.delete': '删除',
|
||
'action.remove': '移除',
|
||
'action.convertToHost': '转换为主机',
|
||
|
||
// Sync
|
||
'sync.cloudSync': '云同步',
|
||
'sync.settings': '同步设置',
|
||
'sync.active': '云同步已启用',
|
||
'sync.syncing': '正在同步…',
|
||
'sync.error': '同步错误',
|
||
'sync.notConfigured': '未配置',
|
||
'sync.failed': '同步失败',
|
||
'sync.connected': '已连接',
|
||
'sync.syncNow': '立即同步',
|
||
'sync.recentActivity': '最近活动',
|
||
'sync.history.uploaded': '已 Upload',
|
||
'sync.history.downloaded': '已 Download',
|
||
'sync.history.resolved': '已处理',
|
||
'sync.toast.completedMessage': '同步完成',
|
||
'sync.toast.errorTitle': '同步错误',
|
||
'sync.autoSync.failedTitle': '同步失败',
|
||
'sync.autoSync.inspectFailedTitle': '同步已暂停',
|
||
'sync.autoSync.inspectFailedMessage': '无法访问云端以检查变更。数据改动或下次启动时会自动重试。',
|
||
'sync.autoSync.syncedTitle': '已从云端同步',
|
||
'sync.autoSync.syncedMessage': '你的数据已从云端更新。',
|
||
'sync.autoSync.noProvider': '未连接云同步 provider。请打开 设置 → Sync & Cloud 进行连接。',
|
||
'sync.autoSync.alreadySyncing': '同步正在进行中。',
|
||
'sync.autoSync.restoreInProgress': '另一个窗口中的本地备份恢复正在进行中,请等待其完成。',
|
||
'sync.autoSync.interruptedApplyTitle': '同步已暂停 — 上次恢复未完成',
|
||
'sync.autoSync.interruptedApplyMessage': '上次本地恢复过程未正常结束,本地数据可能处于半应用状态。请打开「设置 → Sync & Cloud → 恢复」,从保护性备份中恢复后再让自动同步继续。',
|
||
'sync.autoSync.vaultLocked': 'Vault 处于锁定状态。请打开 设置 → Sync & Cloud 解锁。',
|
||
'sync.autoSync.conflictDetected': '检测到同步冲突。请打开 设置 → Sync & Cloud 处理。',
|
||
'sync.autoSync.syncFailed': '同步失败',
|
||
'sync.autoSync.restoredTitle': '已恢复',
|
||
'sync.autoSync.restoredMessage': '已从云端恢复主机库数据。',
|
||
'sync.autoSync.keptLocalTitle': '已保留本地数据',
|
||
'sync.autoSync.keptLocalMessage': '保留了空的本地主机库,未应用云端数据。',
|
||
'sync.autoSync.emptyVaultConflict.title': '检测到空主机库',
|
||
'sync.autoSync.emptyVaultConflict.description': '本地主机库为空,但云端有数据。这通常发生在应用更新或存储重置之后。请选择如何处理:',
|
||
'sync.autoSync.emptyVaultConflict.cloudLabel': '云端',
|
||
'sync.autoSync.emptyVaultConflict.restore': '从云端恢复',
|
||
'sync.autoSync.emptyVaultConflict.restoreDesc': '推荐 — 从云端备份恢复主机、密钥和代码片段',
|
||
'sync.autoSync.emptyVaultConflict.keepEmpty': '保持为空',
|
||
'sync.autoSync.emptyVaultConflict.keepEmptyDesc': '从头开始,使用空的主机库',
|
||
'sync.autoSync.emptyVaultConflict.cloudSummary': '{hosts} 台主机,{keys} 个密钥,{snippets} 个代码片段',
|
||
'sync.autoSync.emptyVaultManual': '无法同步:本地 vault 为空。请先从本地备份恢复,或在同步面板里使用"强制推送"。',
|
||
|
||
'sync.blocked.title': '同步已暂停',
|
||
'sync.blocked.reason.bulkShrink': '即将从云端删除 {baseCount} 条 {entityType} 中的 {lost} 条(缩减 {percent}%)。',
|
||
'sync.blocked.reason.largeShrink': '即将从云端删除 {lost} 条 {entityType}。',
|
||
'sync.blocked.detail': '通常是本地状态异常(钥匙串故障、数据加载不全)导致。请从本地备份恢复,如果确实要删这些条目请使用强制推送。',
|
||
'sync.blocked.restoreButton': '从本地备份恢复',
|
||
'sync.blocked.forcePushButton': '强制推送',
|
||
|
||
'sync.forcePush.title': '确认强制推送',
|
||
'sync.forcePush.body': '你将从云端移除 {lost} 条 {entityType},此操作不可撤销。继续?',
|
||
'sync.forcePush.confirm': '确认推送',
|
||
'sync.forcePush.cancel': '取消',
|
||
|
||
'sync.entityType.hosts': '主机',
|
||
'sync.entityType.keys': '密钥',
|
||
'sync.entityType.identities': '身份',
|
||
'sync.entityType.snippets': '代码片段',
|
||
'sync.entityType.customGroups': '分组',
|
||
'sync.entityType.snippetPackages': '片段包',
|
||
'sync.entityType.knownHosts': '主机密钥记录',
|
||
'sync.entityType.portForwardingRules': '端口转发规则',
|
||
'sync.entityType.groupConfigs': '分组配置',
|
||
|
||
'sync.credentialsUnavailable': '当前设备无法解密部分已保存凭据。请先在本地重新输入凭据后再同步。',
|
||
'time.never': '从未',
|
||
'time.justNow': '刚刚',
|
||
'time.minutesAgo': '{minutes} 分钟前',
|
||
|
||
// Vault navigation
|
||
'vault.nav.hosts': '主机',
|
||
'vault.nav.keychain': '钥匙串',
|
||
'vault.nav.portForwarding': '端口转发',
|
||
'vault.nav.snippets': '代码片段',
|
||
'vault.nav.knownHosts': '已知主机',
|
||
'vault.nav.logs': '日志',
|
||
|
||
'vault.groups.title': '分组',
|
||
'vault.groups.total': '共 {count} 个',
|
||
'vault.groups.hostsCount': '{count} 台主机',
|
||
'vault.groups.newSubgroup': '新建子分组',
|
||
'vault.groups.rename': '重命名分组',
|
||
'vault.groups.delete': '删除分组',
|
||
'vault.groups.createSubfolder': '创建子分组',
|
||
'vault.groups.createRoot': '创建根分组',
|
||
'vault.groups.createDialog.desc': '创建新的分组用于组织主机。',
|
||
'vault.groups.renameDialogTitle': '重命名分组',
|
||
'vault.groups.renameDialog.desc': '重命名已有分组。',
|
||
'vault.groups.deleteDialogTitle': '删除分组',
|
||
'vault.groups.deleteDialog.desc': '这将永久删除该分组并将所有主机移动到根级别。',
|
||
'vault.groups.deleteDialog.managedDesc': '这是一个托管的 SSH config 分组。删除后将同时删除所有主机并断开与源文件的连接。',
|
||
'vault.groups.deleteDialog.deleteHosts': '同时删除该分组下的所有主机',
|
||
'vault.groups.ungrouped': '未分组',
|
||
'vault.groups.field.name': '分组名称',
|
||
'vault.groups.placeholder.example': '例如:Production',
|
||
'vault.groups.parentLabel': '父级',
|
||
'vault.groups.pathLabel': '路径',
|
||
'vault.groups.settings': '分组设置',
|
||
'vault.groups.details': '分组详情',
|
||
'vault.groups.details.general': '常规',
|
||
'vault.groups.details.ssh': 'SSH',
|
||
'vault.groups.details.telnet': 'Telnet',
|
||
'vault.groups.details.advanced': '高级',
|
||
'vault.groups.details.appearance': '外观',
|
||
'vault.groups.details.mosh': 'Mosh',
|
||
'vault.groups.details.parentGroup': '父分组',
|
||
'vault.groups.details.none': '无',
|
||
'vault.groups.details.inherited': '继承自分组',
|
||
'vault.groups.details.addProtocol': '添加协议',
|
||
'vault.groups.details.removeProtocol': '移除协议',
|
||
'vault.groups.details.fontFamily': '字体',
|
||
'vault.groups.details.fontSize': '字号',
|
||
'vault.groups.errors.required': '分组名称不能为空。',
|
||
'vault.groups.errors.invalidChars': "分组名称不能包含 '/' 或 '\\\\'.",
|
||
'vault.groups.errors.duplicatePath': '该位置已存在同名分组。',
|
||
|
||
'vault.managedSource.unmanage': '取消托管',
|
||
'vault.managedSource.unmanageSuccess': '已取消托管分组',
|
||
|
||
'vault.hosts.header.entries': '{count} 条',
|
||
'vault.hosts.header.live': '{count} 个在线',
|
||
|
||
// Vault hosts header/actions
|
||
'vault.hosts.search.placeholder': '查找主机或 ssh user@hostname / ssh -p 2222 user@hostname…',
|
||
'vault.hosts.connect': '连接',
|
||
'vault.view.grid': '网格',
|
||
'vault.view.list': '列表',
|
||
'vault.view.tree': '树形',
|
||
'vault.tree.expandAll': '展开全部',
|
||
'vault.tree.collapseAll': '折叠全部',
|
||
'vault.hosts.newHost': '新建主机',
|
||
'vault.hosts.newGroup': '新建分组',
|
||
'vault.hosts.import': '导入',
|
||
'vault.hosts.export': '导出',
|
||
'vault.hosts.export.toast.success': '已导出 {count} 个主机到 CSV',
|
||
'vault.hosts.export.toast.successWithSkipped': '已导出 {count} 个主机到 CSV(跳过 {skipped} 个不支持的主机)',
|
||
'vault.hosts.export.toast.noHosts': '没有主机可导出',
|
||
'vault.hosts.allHosts': '全部主机',
|
||
'vault.hosts.pinned': '已置顶',
|
||
'vault.hosts.recentlyConnected': '最近连接',
|
||
'vault.hosts.pinToTop': '置顶',
|
||
'vault.hosts.unpin': '取消置顶',
|
||
'vault.hosts.copyCredentials': '复制账密信息',
|
||
'vault.hosts.copyCredentials.toast.success': '账密信息已复制到剪贴板',
|
||
'vault.hosts.copyCredentials.toast.noPassword': '该主机未保存密码',
|
||
'vault.hosts.multiSelect': '多选',
|
||
'vault.hosts.selected': '已选择 {count} 项',
|
||
'vault.hosts.selectAll': '全选',
|
||
'vault.hosts.deselectAll': '取消全选',
|
||
'vault.hosts.deleteSelected': '删除 ({count})',
|
||
'vault.hosts.deleteMultiple.success': '已删除 {count} 个主机',
|
||
'vault.hosts.moveToGroup.success': '已将 {host} 移动到 {group}',
|
||
'vault.hosts.empty.title': '设置你的主机',
|
||
'vault.hosts.empty.desc': '保存主机以快速连接到你的服务器、虚拟机和容器。',
|
||
|
||
// Vault import
|
||
'vault.import.title': '添加数据到你的 Vault',
|
||
'vault.import.desc': '从常见工具迁移连接信息。选择一种格式开始导入。',
|
||
'vault.import.chooseFormat': '选择文件格式',
|
||
'vault.import.csv.tip': '批量导入:可使用 CSV 模板填写后导入。',
|
||
'vault.import.csv.downloadTemplate': '下载 CSV 模板',
|
||
'vault.import.toast.start': '正在从 {format} 导入...',
|
||
'vault.import.toast.completedTitle': '导入完成',
|
||
'vault.import.toast.failedTitle': '导入失败',
|
||
'vault.import.toast.noEntries': '{format} 文件中没有可导入的条目。',
|
||
'vault.import.toast.noNewHosts': '从 {format} 没有导入到新的主机。',
|
||
'vault.import.toast.summary': '已导入 {count} 个主机(跳过 {skipped},重复 {duplicates})。',
|
||
'vault.import.toast.firstIssue': '首个问题:{issue}',
|
||
'vault.import.sshConfig.chooseMode': '选择如何导入你的 SSH config 文件。',
|
||
'vault.import.sshConfig.modeQuestion': '你希望如何导入?',
|
||
'vault.import.sshConfig.importOnly': '仅导入',
|
||
'vault.import.sshConfig.importOnlyDesc': '一次性导入,修改不会同步回文件。',
|
||
'vault.import.sshConfig.managed': '托管同步',
|
||
'vault.import.sshConfig.managedDesc': '保持同步,修改会自动保存回文件。',
|
||
'vault.import.sshConfig.managedGroup': 'ssh config',
|
||
'vault.import.sshConfig.managedSuccess': '已导入 {count} 个主机,文件已托管。',
|
||
'vault.import.sshConfig.alreadyManaged': '该文件已被托管。',
|
||
'vault.import.sshConfig.alreadyManagedDesc': '该文件已在分组 "{group}" 下托管。如需重新导入,请先移除现有的托管源。',
|
||
'vault.import.sshConfig.noFilePath': '无法托管此文件。',
|
||
'vault.import.sshConfig.noFilePathDesc': '无法确定文件路径。托管同步需要访问文件系统。',
|
||
|
||
// Known Hosts
|
||
'knownHosts.search.placeholder': '搜索已知主机...',
|
||
'knownHosts.action.scanSystem': '扫描系统',
|
||
'knownHosts.action.importFile': '导入文件',
|
||
'knownHosts.action.browseFile': '浏览文件',
|
||
'knownHosts.empty.title': '暂无已知主机',
|
||
'knownHosts.empty.desc':
|
||
'Known Hosts 是你之前连接过的 SSH server。导入系统的 known_hosts 文件以开始。',
|
||
'knownHosts.results.showingLimited': '显示 {shown}/{total} 个主机。使用搜索查找特定主机。',
|
||
'knownHosts.toast.scanUnavailable': '当前平台无法扫描系统 known_hosts。',
|
||
'knownHosts.toast.scanNoFile': '未找到系统 known_hosts 文件。',
|
||
'knownHosts.toast.scanNoEntries': 'known_hosts 中没有可用条目。',
|
||
'knownHosts.toast.scanImported': '已导入 {count} 个新主机。',
|
||
'knownHosts.toast.scanNoNew': '没有发现新的主机。',
|
||
'knownHosts.toast.scanFailed': '扫描系统 known_hosts 失败。',
|
||
|
||
// Port Forwarding
|
||
'pf.empty.title': '配置端口转发规则',
|
||
'pf.empty.desc': '保存端口转发规则,用于访问数据库、Web 应用等服务。',
|
||
'pf.title': '端口转发规则',
|
||
'pf.rulesCount': '{count} 条规则',
|
||
'pf.wizard.editTitle': '编辑端口转发规则',
|
||
'pf.wizard.newTitle': '新建端口转发规则',
|
||
'pf.wizard.saveChanges': '保存修改',
|
||
'pf.wizard.done': '完成',
|
||
'pf.wizard.continue': '继续',
|
||
'pf.wizard.cancel': '取消',
|
||
'pf.wizard.skipWizard': '跳过向导',
|
||
'pf.error.hostNotFound': '未找到主机',
|
||
'pf.toast.titleWithLabel': '端口转发规则: {label}',
|
||
'pf.type.local': '本地转发',
|
||
'pf.type.remote': '远程转发',
|
||
'pf.type.dynamic': '动态转发',
|
||
'pf.type.menu.local': '本地转发',
|
||
'pf.type.menu.remote': '远程转发',
|
||
'pf.type.menu.dynamic': '动态转发',
|
||
'pf.type.local.desc': '本地转发让你像访问本地一样访问远程服务端口。',
|
||
'pf.type.remote.desc': '远程转发在远端开启端口,并将连接转发到本地(当前)主机。',
|
||
'pf.type.dynamic.desc': '动态转发将 Netcatty 作为 SOCKS 代理使用。',
|
||
'pf.wizard.type.title': '选择端口转发类型:',
|
||
'pf.wizard.localConfig.title': '设置本地端口与绑定地址:',
|
||
'pf.wizard.localConfig.desc': '该端口会在本地(当前设备)打开,并接收流量。',
|
||
'pf.wizard.localConfig.localPort': '本地端口 *',
|
||
'pf.wizard.bindAddress': '绑定地址',
|
||
'pf.wizard.remoteHost.title': '选择远端主机:',
|
||
'pf.wizard.remoteHost.desc': '选择要打开端口的远端主机。该端口的流量将转发到目标地址。',
|
||
'pf.wizard.remoteConfig.title': '设置端口与绑定地址:',
|
||
'pf.wizard.remoteConfig.desc': '将从所选主机的指定端口与网卡地址转发流量。',
|
||
'pf.wizard.remoteConfig.remotePort': '远端端口 *',
|
||
'pf.wizard.destination.title': '设置目标地址:',
|
||
'pf.wizard.destination.desc.local': '输入你希望通过 tunnel 访问的远端目标地址。',
|
||
'pf.wizard.destination.desc.remote': '要转发流量到的目标地址与端口。',
|
||
'pf.wizard.destination.address': '目标地址 *',
|
||
'pf.wizard.destination.addressPlaceholder': '例如:127.0.0.1 或 192.168.1.100',
|
||
'pf.wizard.destination.port': '目标端口 *',
|
||
'pf.wizard.sshServer.title': '选择 SSH server:',
|
||
'pf.wizard.sshServer.desc.dynamic': '选择作为 SOCKS proxy 的 SSH server。',
|
||
'pf.wizard.sshServer.desc.default': '选择用于将流量 tunnel 到目标地址的 SSH server。',
|
||
'pf.wizard.label.title': '设置 Label:',
|
||
'pf.wizard.label.placeholder.dynamic': '例如:SOCKS Proxy',
|
||
'pf.wizard.label.placeholder.default': '例如:MySQL Production',
|
||
'pf.wizard.label.placeholder.remoteRule': '例如:Remote Rule',
|
||
'pf.wizard.placeholders.portExample': '例如:{port}',
|
||
|
||
// SFTP
|
||
'sftp.newFolder': '新建文件夹',
|
||
'sftp.newFile': '新建文件',
|
||
'sftp.filter': '筛选',
|
||
'sftp.filter.placeholder': '按文件名筛选...',
|
||
'sftp.bookmark.add': '收藏此路径',
|
||
'sftp.bookmark.remove': '取消收藏',
|
||
'sftp.bookmark.addGlobal': '+全局',
|
||
'sftp.bookmark.addGlobalTooltip': '保存为全局收藏(所有主机共享)',
|
||
'sftp.bookmark.empty': '暂无收藏路径',
|
||
'sftp.columns.name': '名称',
|
||
'sftp.columns.modified': '修改时间',
|
||
'sftp.columns.size': '大小',
|
||
'sftp.columns.kind': '类型',
|
||
'sftp.columns.actions': '操作',
|
||
'sftp.emptyDirectory': '空目录',
|
||
'sftp.nav.up': '返回上层',
|
||
'sftp.nav.home': '返回主目录',
|
||
'sftp.nav.refresh': '刷新',
|
||
'sftp.upload': '上传',
|
||
'sftp.uploadFiles': '上传文件',
|
||
'sftp.uploadFolder': '上传文件夹',
|
||
'sftp.dragDropToUpload': '拖拽文件到这里上传',
|
||
'sftp.retry': '重试',
|
||
'sftp.context.open': '打开',
|
||
'sftp.context.navigateTo': '跳转到这里',
|
||
'sftp.context.moveTo': '移动到...',
|
||
'sftp.context.moveToParent': '移动到上级目录',
|
||
'sftp.moveTo.title': '移动到目录',
|
||
'sftp.moveTo.placeholder': '输入目标目录路径',
|
||
'sftp.moveTo.confirm': '移动',
|
||
'sftp.moveTo.pathNotFound': '目录不存在或无法访问',
|
||
'sftp.context.download': '下载',
|
||
'sftp.context.copyToOtherPane': '复制到另一侧',
|
||
'sftp.viewMode.label': '视图模式',
|
||
'sftp.viewMode.list': '列表视图',
|
||
'sftp.viewMode.tree': '树形视图',
|
||
'sftp.tree.loadError': '加载目录失败',
|
||
'sftp.tree.loading': '加载中...',
|
||
'sftp.kind.folder': '文件夹',
|
||
'sftp.context.rename': '重命名',
|
||
'sftp.context.permissions': '权限',
|
||
'sftp.context.delete': '删除',
|
||
'sftp.context.refresh': '刷新',
|
||
'sftp.context.downloadSelected': '下载选中项({count})',
|
||
'sftp.context.deleteSelected': '删除选中项({count})',
|
||
'sftp.dropFilesHere': '拖拽文件到这里',
|
||
'sftp.itemsCount': '{count} 个项目',
|
||
'sftp.selectedCount': '已选 {count} 个',
|
||
'sftp.path.doubleClickToEdit': '双击编辑路径',
|
||
'sftp.showHiddenPaths': '隐藏的路径',
|
||
'sftp.task.waiting': '等待中...',
|
||
'sftp.transfer.preparing': '准备中...',
|
||
'sftp.status.loading': '加载中...',
|
||
'sftp.status.uploading': '上传中...',
|
||
'sftp.status.ready': '就绪',
|
||
'sftp.transfers': '传输',
|
||
'sftp.transfers.active': '{count} 个进行中',
|
||
'sftp.transfers.clearCompleted': '清除已完成',
|
||
'sftp.transfers.calculatingTotal': '正在统计总大小...',
|
||
'sftp.transfers.filesCount': '{count} 个文件',
|
||
'sftp.transfers.filesProgress': '{current}/{total} 个文件',
|
||
'sftp.transfers.expandChildren': '展开文件',
|
||
'sftp.transfers.collapseChildren': '收起文件',
|
||
'sftp.transfers.expandChildList': '展开详情',
|
||
'sftp.transfers.collapseChildList': '收起',
|
||
'sftp.transfers.dragToResize': '拖拽调整高度',
|
||
'sftp.goUp': '上一级',
|
||
'sftp.goToTerminalCwd': '定位到终端当前目录',
|
||
'sftp.encoding.label': '文件名编码',
|
||
'sftp.encoding.auto': '自动',
|
||
'sftp.encoding.utf8': 'UTF-8',
|
||
'sftp.encoding.gb18030': 'GB18030',
|
||
'sftp.goHome': '返回主目录',
|
||
'sftp.folderName': '文件夹名称',
|
||
'sftp.folderName.placeholder': '输入文件夹名称',
|
||
'sftp.fileName': '文件名称',
|
||
'sftp.fileName.placeholder': '输入文件名称',
|
||
'sftp.prompt.newFolderName': '新建文件夹名称?',
|
||
'sftp.rename.title': '重命名',
|
||
'sftp.rename.newName': '新名称',
|
||
'sftp.rename.placeholder': '输入新名称',
|
||
'sftp.confirm.deleteOne': '删除 "{name}"?',
|
||
'sftp.deleteConfirm.single': '删除 "{name}"?',
|
||
'sftp.deleteConfirm.title': '删除 {count} 个项目?',
|
||
'sftp.deleteConfirm.desc': '此操作不可撤销,将删除以下内容:',
|
||
'sftp.deleteConfirm.descSingle': '此操作不可撤销。',
|
||
'sftp.deleteConfirm.host': '主机',
|
||
'sftp.deleteConfirm.path': '路径',
|
||
'sftp.error.loadFailed': '加载目录失败',
|
||
'sftp.error.downloadFailed': '下载失败',
|
||
'sftp.error.uploadFailed': '上传失败',
|
||
'sftp.error.deleteFailed': '删除失败',
|
||
'sftp.error.createFolderFailed': '创建文件夹失败',
|
||
'sftp.error.createFileFailed': '创建文件失败',
|
||
'sftp.error.invalidFileName': '文件名包含非法字符:{chars}',
|
||
'sftp.error.reservedName': '此文件名是系统保留名称',
|
||
'sftp.overwrite.title': '文件已存在',
|
||
'sftp.overwrite.desc': '名为"{name}"的文件已存在。是否要替换它?',
|
||
'sftp.overwrite.confirm': '替换',
|
||
'sftp.error.renameFailed': '重命名失败',
|
||
'sftp.picker.title': '选择主机',
|
||
'sftp.picker.desc': '为{side}窗格选择主机',
|
||
'sftp.picker.searchPlaceholder': '搜索主机...',
|
||
'sftp.picker.local.title': '本地文件系统',
|
||
'sftp.picker.local.desc': '浏览本地文件',
|
||
'sftp.picker.local.badge': '本地',
|
||
'sftp.picker.noMatch': '没有匹配的主机',
|
||
'sftp.permissions.title': '编辑权限',
|
||
'sftp.permissions.owner': '所有者',
|
||
'sftp.permissions.group': '群组',
|
||
'sftp.permissions.others': '其他',
|
||
'sftp.permissions.octal': '八进制',
|
||
'sftp.permissions.symbolic': '符号',
|
||
'sftp.permissions.success': '权限已更新',
|
||
'sftp.permissions.failed': '权限更新失败',
|
||
|
||
// Quick Switcher
|
||
'qs.search.placeholder': '搜索主机或标签页',
|
||
'qs.jumpTo': '跳转到',
|
||
'qs.localTerminal': '本地终端',
|
||
'qs.localShells': '本地 Shell',
|
||
'qs.default': '默认',
|
||
|
||
// Select Host panel
|
||
'selectHost.title': '选择主机',
|
||
'selectHost.noHostsFound': '未找到主机',
|
||
'selectHost.newHost': '新建主机',
|
||
'selectHost.continue': '继续',
|
||
'selectHost.continueWithCount': '继续(已选 {count} 个)',
|
||
|
||
// Quick Connect
|
||
'quickConnect.knownHost.title': '确认要连接吗?',
|
||
'quickConnect.knownHost.authenticity': '无法验证 {hostname} 的真实性。',
|
||
'quickConnect.knownHost.fingerprintLabel': '{keyType} fingerprint (SHA256):',
|
||
'quickConnect.knownHost.addQuestion': '是否将它加入 Known Hosts?',
|
||
'quickConnect.knownHost.addAndContinue': '加入并继续',
|
||
'quickConnect.addKey': '添加 key',
|
||
'quickConnect.warning.unparsedOptions': '部分 SSH 参数已被忽略: {options}',
|
||
|
||
// Protocol select dialog
|
||
'protocolSelect.chooseProtocol': '选择协议',
|
||
'protocolSelect.port': '端口:',
|
||
// Host Details
|
||
'hostDetails.title.details': '主机详情',
|
||
'hostDetails.title.new': '新建主机',
|
||
'hostDetails.saveAria': '保存',
|
||
'hostDetails.section.address': '地址',
|
||
'hostDetails.hostname.placeholder': 'IP 或 主机名',
|
||
'hostDetails.section.general': '通用',
|
||
'hostDetails.section.sftp': 'SFTP 设置',
|
||
'hostDetails.sftp.sudo': 'Sudo 提权模式',
|
||
'hostDetails.sftp.sudo.desc': '使用保存的密码自动获取 Root 权限',
|
||
'hostDetails.sftp.sudo.passwordWarning': 'Sudo 模式需要密码。请在上方配置密码,或确保服务器允许免密 sudo。',
|
||
'hostDetails.sftp.encoding': '文件名编码',
|
||
'hostDetails.sftp.encoding.desc': '选择用于解码和发送 SFTP 文件名的编码。',
|
||
'hostDetails.label.placeholder': '名称(例如:Production Server)',
|
||
'hostDetails.group.placeholder': '父级 Group',
|
||
'hostDetails.section.credentials': '凭据',
|
||
'hostDetails.section.portCredentials': '端口与凭据',
|
||
'hostDetails.section.appearance': '外观',
|
||
'hostDetails.distro.title': 'Linux 发行版',
|
||
'hostDetails.distro.desc': '可在连接后自动探测,也可以手动覆盖图标所用的发行版。',
|
||
'hostDetails.distro.mode': '来源',
|
||
'hostDetails.distro.mode.auto': '自动探测',
|
||
'hostDetails.distro.mode.manual': '手动覆盖',
|
||
'hostDetails.distro.detectedLabel': '当前值',
|
||
'hostDetails.distro.manualLabel': '手动指定',
|
||
'hostDetails.distro.pending': '首次连接后自动探测',
|
||
'hostDetails.distro.unknown': '未知',
|
||
'hostDetails.distro.option.linux': '通用 Linux',
|
||
'hostDetails.distro.option.ubuntu': 'Ubuntu',
|
||
'hostDetails.distro.option.debian': 'Debian',
|
||
'hostDetails.distro.option.centos': 'CentOS',
|
||
'hostDetails.distro.option.rocky': 'Rocky Linux',
|
||
'hostDetails.distro.option.fedora': 'Fedora',
|
||
'hostDetails.distro.option.arch': 'Arch Linux',
|
||
'hostDetails.distro.option.alpine': 'Alpine',
|
||
'hostDetails.distro.option.amazon': 'Amazon Linux',
|
||
'hostDetails.distro.option.opensuse': 'openSUSE / SLES',
|
||
'hostDetails.distro.option.redhat': 'Red Hat / RHEL',
|
||
'hostDetails.distro.option.almalinux': 'AlmaLinux',
|
||
'hostDetails.distro.option.oracle': 'Oracle Linux',
|
||
'hostDetails.distro.option.kali': 'Kali Linux',
|
||
'hostDetails.distro.option.cisco': '思科',
|
||
'hostDetails.distro.option.juniper': '瞻博网络',
|
||
'hostDetails.distro.option.huawei': '华为',
|
||
'hostDetails.distro.option.hpe': '慧与 / H3C',
|
||
'hostDetails.distro.option.mikrotik': 'MikroTik',
|
||
'hostDetails.distro.option.fortinet': '飞塔',
|
||
'hostDetails.distro.option.paloalto': 'Palo Alto Networks',
|
||
'hostDetails.distro.option.zyxel': '合勤',
|
||
'hostDetails.section.mosh': 'Mosh',
|
||
'hostDetails.username.placeholder': '用户名',
|
||
'hostDetails.password.placeholder': '密码',
|
||
'hostDetails.password.show': '显示密码',
|
||
'hostDetails.password.hide': '隐藏密码',
|
||
'hostDetails.password.save': '保存密码',
|
||
'hostDetails.identity.suggestions': '身份',
|
||
'hostDetails.identity.missing': '身份不存在',
|
||
'hostDetails.credential.keyCertificate': '密钥 / 证书 / 本地密钥',
|
||
'hostDetails.credential.key': '密钥',
|
||
'hostDetails.credential.certificate': '证书',
|
||
'hostDetails.credential.localKeyFile': '本地密钥文件',
|
||
'hostDetails.credential.localKeyFilePlaceholder': '~/.ssh/id_ed25519',
|
||
'hostDetails.credential.browseKeyFile': '浏览…',
|
||
'hostDetails.credential.missing': '凭据不存在',
|
||
'hostDetails.keys.search': '搜索密钥…',
|
||
'hostDetails.keys.empty': '暂无密钥',
|
||
'hostDetails.certs.search': '搜索证书…',
|
||
'hostDetails.certs.empty': '暂无证书',
|
||
'hostDetails.agentForwarding': '转发 SSH 密钥',
|
||
'hostDetails.agentForwarding.desc': '允许远程服务器使用本地 SSH 密钥(例如用于 git 操作)',
|
||
'hostDetails.agentForwarding.agentNotRunning': 'SSH Agent 不可用',
|
||
'hostDetails.agentForwarding.agentNotRunningHint': '未检测到 SSH Agent。请启用 Windows OpenSSH Authentication Agent 服务,或使用兼容的 Agent(如 Bitwarden、1Password、gpg-agent)。',
|
||
'hostDetails.section.agentForwarding': 'SSH 代理',
|
||
'hostDetails.section.deviceType': '设备类型',
|
||
'hostDetails.deviceType': '网络设备模式',
|
||
'hostDetails.deviceType.desc': '适用于通过 SSH 连接的网络设备(交换机、路由器、防火墙)。命令将原样发送,不进行 Shell 包装,兼容华为 VRP、Cisco IOS 等厂商 CLI。',
|
||
'hostDetails.deviceType.warning': 'AI 代理命令将直接发送,无法获取退出码。仅建议在设备不运行标准 Shell 时启用。',
|
||
'hostDetails.section.legacyAlgorithms': '旧版算法',
|
||
'hostDetails.legacyAlgorithms': '允许旧版算法',
|
||
'hostDetails.legacyAlgorithms.desc': '启用已弃用的 SSH 算法(diffie-hellman-group1、ssh-dss、3des-cbc 等)以连接老旧网络设备。',
|
||
'hostDetails.legacyAlgorithms.warning': '这些算法存在已知安全漏洞,仅建议在老旧设备不支持现代加密时启用。',
|
||
'hostDetails.backspaceBehavior': 'Backspace 行为',
|
||
'hostDetails.backspaceBehavior.default': '默认',
|
||
'hostDetails.jumpHosts': '通过主机代理',
|
||
'hostDetails.jumpHosts.hops': '{count} 跳',
|
||
'hostDetails.jumpHosts.direct': '直连',
|
||
'hostDetails.jumpHosts.configure': '配置代理主机',
|
||
'hostDetails.proxy': '通过 HTTP/SOCKS5 代理',
|
||
'hostDetails.proxy.none': '无',
|
||
'hostDetails.proxy.edit': '编辑代理',
|
||
'hostDetails.proxy.configure': '配置代理',
|
||
'hostDetails.envVars': '环境变量',
|
||
'hostDetails.envVars.add': '添加环境变量',
|
||
'hostDetails.startupCommand': '启动命令',
|
||
'hostDetails.startupCommand.placeholder': '连接后执行的命令(例如:cd /app && ls)',
|
||
'hostDetails.startupCommand.help': 'SSH 连接建立后将自动执行该命令。',
|
||
'hostDetails.otherProtocols': '其他协议',
|
||
'hostDetails.telnetOn': 'Telnet on',
|
||
'hostDetails.port': '端口',
|
||
'hostDetails.telnet.credentials': '凭据',
|
||
'hostDetails.telnet.username': 'Telnet 用户名',
|
||
'hostDetails.telnet.password': 'Telnet 密码',
|
||
'hostDetails.charset.placeholder': '字符集(例如 UTF-8)',
|
||
'hostDetails.telnet.add': '添加 Telnet 协议',
|
||
'hostDetails.tags': '标签',
|
||
'hostDetails.group': '分组',
|
||
'hostDetails.selectGroup': '选择分组',
|
||
'hostDetails.addTag': '添加标签...',
|
||
'hostDetails.createTag': '创建标签',
|
||
'hostDetails.createGroup': '创建分组',
|
||
|
||
// Host form (legacy modal)
|
||
'hostForm.title.edit': '编辑主机',
|
||
'hostForm.title.new': '新建主机',
|
||
'hostForm.desc.edit': '更新该主机的连接信息',
|
||
'hostForm.desc.new': '创建一个新的 SSH 主机条目',
|
||
'hostForm.field.label': '名称',
|
||
'hostForm.placeholder.label': 'My Production Server',
|
||
'hostForm.field.hostname': 'Hostname / IP',
|
||
'hostForm.placeholder.hostname': '192.168.1.1',
|
||
'hostForm.field.port': '端口',
|
||
'hostForm.field.username': '用户名',
|
||
'hostForm.field.osType': '操作系统类型',
|
||
'hostForm.placeholder.selectOs': '选择操作系统',
|
||
'hostForm.field.group': '分组',
|
||
'hostForm.placeholder.group': '例如:AWS、DigitalOcean',
|
||
'hostForm.field.tags': '标签',
|
||
'hostForm.placeholder.addTag': '添加标签…',
|
||
'hostForm.auth.method': '认证方式',
|
||
'hostForm.auth.password': '密码',
|
||
'hostForm.auth.sshKey': 'SSH密钥',
|
||
'hostForm.auth.selectKey': '选择 SSH密钥',
|
||
'hostForm.auth.noKeys': '暂无密钥',
|
||
'hostForm.auth.noKeysHint': '钥匙串中未找到 SSH密钥,请先创建一个。',
|
||
'hostForm.saveHost': '保存主机',
|
||
|
||
// Connection logs
|
||
'logs.table.date': '日期',
|
||
'logs.table.user': '用户',
|
||
'logs.table.host': '主机',
|
||
'logs.table.saved': '收藏',
|
||
'logs.empty.title': '暂无连接日志',
|
||
'logs.empty.desc': '当你连接主机或打开本地终端后,这里会显示连接历史。',
|
||
'logs.loadMore': '加载更多 ({count} 条)',
|
||
'logs.ongoing': '进行中',
|
||
'logs.localTerminal': '本地终端',
|
||
'logs.action.save': '收藏',
|
||
'logs.action.unsave': '取消收藏',
|
||
'logs.action.delete': '删除',
|
||
|
||
// Log view
|
||
'logView.customizeAppearance': '自定义外观',
|
||
'logView.appearance': '外观',
|
||
'logView.readOnly': '只读',
|
||
'logView.export': '导出',
|
||
|
||
// Terminal toolbar / search / context menu / auth
|
||
'terminal.toolbar.openSftp': '打开 SFTP',
|
||
'terminal.toolbar.availableAfterConnect': '连接后可用',
|
||
'terminal.toolbar.sftp': 'SFTP',
|
||
'terminal.toolbar.scripts': '脚本',
|
||
'terminal.toolbar.library': '库',
|
||
'terminal.toolbar.noSnippets': '暂无代码片段',
|
||
'terminal.toolbar.terminalSettings': '终端设置',
|
||
'terminal.toolbar.searchTerminal': '搜索终端',
|
||
'terminal.toolbar.search': '搜索',
|
||
'terminal.toolbar.broadcast': '广播',
|
||
'terminal.toolbar.broadcastEnable': '启用广播模式',
|
||
'terminal.toolbar.broadcastDisable': '关闭广播模式',
|
||
'terminal.toolbar.composeBar': '撰写栏',
|
||
'terminal.composeBar.placeholder': '在此输入命令,按回车发送...',
|
||
'terminal.composeBar.send': '发送',
|
||
'terminal.composeBar.close': '关闭撰写栏',
|
||
'terminal.composeBar.broadcasting': '正在广播到所有会话',
|
||
'terminal.toolbar.focus': '聚焦',
|
||
'terminal.toolbar.focusMode': '聚焦模式',
|
||
'terminal.toolbar.encoding': '终端编码',
|
||
'terminal.toolbar.encoding.utf8': 'UTF-8',
|
||
'terminal.toolbar.encoding.gb18030': 'GB18030',
|
||
'terminal.toolbar.closeSession': '关闭会话',
|
||
'terminal.toolbar.hostHighlight.title': '主机关键字高亮',
|
||
'terminal.toolbar.hostHighlight.noRules': '此主机未定义自定义高亮规则',
|
||
'terminal.toolbar.hostHighlight.addRule': '添加新规则',
|
||
'terminal.toolbar.hostHighlight.labelPlaceholder': '标签(例如:错误)',
|
||
'terminal.toolbar.hostHighlight.patternPlaceholder': '正则表达式(例如:\\bfailed\\b)',
|
||
'terminal.toolbar.hostHighlight.invalidPattern': '无效的正则表达式',
|
||
'terminal.toolbar.hostHighlight.clearAll': '清除全部',
|
||
'terminal.toolbar.hostHighlight.changeColor': '更改高亮颜色',
|
||
'terminal.toolbar.hostHighlight.selectColor': '选择新规则的颜色',
|
||
'terminal.serverStats.cpu': 'CPU 使用率',
|
||
'terminal.serverStats.cpuCores': 'CPU 核心使用率',
|
||
'terminal.serverStats.memory': '内存使用',
|
||
'terminal.serverStats.memoryDetails': '内存详情',
|
||
'terminal.serverStats.memUsed': '已用',
|
||
'terminal.serverStats.memBuffers': '缓冲区',
|
||
'terminal.serverStats.memCached': '缓存',
|
||
'terminal.serverStats.memFree': '空闲',
|
||
'terminal.serverStats.swap': '交换空间',
|
||
'terminal.serverStats.swapUsed': '已用交换',
|
||
'terminal.serverStats.swapFree': '空闲交换',
|
||
'terminal.serverStats.swapTotal': '总计',
|
||
'terminal.serverStats.topProcesses': '内存占用前十进程',
|
||
'terminal.serverStats.disk': '磁盘使用(根分区)',
|
||
'terminal.serverStats.diskDetails': '已挂载磁盘',
|
||
'terminal.serverStats.network': '网络速度',
|
||
'terminal.serverStats.networkDetails': '网络接口',
|
||
'terminal.serverStats.noData': '暂无数据',
|
||
'terminal.dragDrop.localTitle': '拖放以插入路径',
|
||
'terminal.dragDrop.localMessage': '文件路径将被插入到终端',
|
||
'terminal.dragDrop.remoteTitle': '拖放以上传文件',
|
||
'terminal.dragDrop.remoteMessage': '文件将通过 SFTP 上传',
|
||
'terminal.dragDrop.notConnected': '无法拖放文件 - 终端未连接',
|
||
'terminal.dragDrop.errorTitle': '拖放错误',
|
||
'terminal.dragDrop.errorMessage': '处理拖放文件失败',
|
||
'terminal.search.placeholder': '搜索…',
|
||
'terminal.search.noResults': '无结果',
|
||
'terminal.search.prevMatch': '上一个匹配 (Shift+Enter)',
|
||
'terminal.search.nextMatch': '下一个匹配 (Enter)',
|
||
'terminal.menu.copy': '复制',
|
||
'terminal.menu.paste': '粘贴',
|
||
'terminal.menu.pasteSelection': '粘贴选中文本',
|
||
'terminal.menu.selectAll': '全选',
|
||
'terminal.menu.splitHorizontal': '水平分屏',
|
||
'terminal.menu.splitVertical': '垂直分屏',
|
||
'terminal.menu.clearBuffer': '清空缓冲区',
|
||
'terminal.menu.closeTerminal': '关闭终端',
|
||
'terminal.auth.password': '密码',
|
||
'terminal.auth.sshKey': 'SSH Key',
|
||
'terminal.auth.username': '用户名',
|
||
'terminal.auth.username.placeholder': 'root',
|
||
'terminal.auth.passwordLabel': '密码',
|
||
'terminal.auth.password.placeholder': '输入密码',
|
||
'terminal.auth.passphrase': '密码短语',
|
||
'terminal.auth.passphrase.placeholder': '可选:所选私钥的密码短语',
|
||
'terminal.auth.certificate': '证书',
|
||
'terminal.auth.selectKey': '选择密钥',
|
||
'terminal.auth.noKeysHint': '暂无密钥,请先在钥匙串中添加。',
|
||
'terminal.auth.continueSave': '继续并保存',
|
||
'terminal.auth.credentialsUnavailable': '当前设备无法解密已保存凭据,请重新输入并再次保存。',
|
||
'terminal.auth.jumpCredentialsUnavailable': '某个跳板机的已保存凭据无法在当前设备解密,请到主机设置中重新填写。',
|
||
'terminal.auth.proxyCredentialsUnavailable': '代理凭据无法在当前设备解密,请到主机设置中重新填写代理密码。',
|
||
'terminal.auth.keyUnavailableFallbackPassword': '已保存 SSH 密钥在当前设备不可用,改用密码认证。',
|
||
'terminal.connectionErrorTitle': '连接错误',
|
||
'terminal.progress.timeoutIn': '将在 {seconds}s 后超时',
|
||
'terminal.progress.disconnected': '已断开',
|
||
'terminal.progress.cancelling': '正在取消...',
|
||
'terminal.progress.startOver': '重新开始',
|
||
'terminal.connection.dismissDisconnectedDialog': '关闭断连提示',
|
||
'terminal.connection.chainOf': 'Chain {current} / {total}',
|
||
'terminal.connection.showLogs': '显示日志',
|
||
'terminal.connection.hideLogs': '隐藏日志',
|
||
'terminal.connection.protocol.ssh': 'SSH',
|
||
'terminal.connection.protocol.telnet': 'Telnet',
|
||
'terminal.connection.protocol.mosh': 'Mosh',
|
||
'terminal.connection.protocol.serial': '串口',
|
||
'terminal.connection.protocol.local': '本地终端',
|
||
'terminal.themeModal.title': 'Terminal 外观',
|
||
'terminal.themeModal.tab.theme': '主题',
|
||
'terminal.themeModal.tab.font': '字体',
|
||
'terminal.themeModal.tab.custom': '自定义',
|
||
'terminal.themeModal.globalTheme': '全局主题',
|
||
'terminal.themeModal.globalFont': '全局字体',
|
||
'terminal.themeModal.fontSize': '字体大小',
|
||
'terminal.themeModal.fontWeight': '字体粗细',
|
||
'terminal.themeModal.livePreview': '实时预览',
|
||
'terminal.themeModal.themeType': '{type} 主题',
|
||
'terminal.hiddenTheme.title': '当前隐藏主题',
|
||
'terminal.hiddenTheme.desc': '这个主题已从手动选择列表中隐藏;当你选择其他可见主题后,它会被替换。',
|
||
'topTabs.toggleTheme.systemExitTitle': '当前正在跟随系统主题',
|
||
'topTabs.toggleTheme.systemExitMessage': '请到设置里选择固定的浅色或深色主题。',
|
||
'topTabs.toggleTheme.openSettings': '打开设置',
|
||
|
||
// Custom Themes
|
||
'terminal.customTheme.section': '自定义主题',
|
||
'terminal.customTheme.yourThemes': '我的主题',
|
||
'terminal.customTheme.new': '新建主题',
|
||
'terminal.customTheme.newDesc': '克隆当前主题并自定义',
|
||
'terminal.customTheme.newTitle': '新建自定义主题',
|
||
'terminal.customTheme.editTitle': '编辑主题',
|
||
'terminal.customTheme.import': '导入 .itermcolors',
|
||
'terminal.customTheme.importDesc': '从 iTerm2 配色方案文件导入',
|
||
'terminal.customTheme.importError': '无法解析所选文件,请确保它是有效的 .itermcolors XML 文件。',
|
||
'terminal.customTheme.delete': '删除主题',
|
||
'terminal.customTheme.confirmDelete': '确认删除',
|
||
'terminal.customTheme.name': '名称',
|
||
'terminal.customTheme.namePlaceholder': '我的自定义主题',
|
||
'terminal.customTheme.type': '类型',
|
||
'terminal.customTheme.group.general': '通用',
|
||
'terminal.customTheme.group.normal': '标准色',
|
||
'terminal.customTheme.group.bright': '高亮色',
|
||
'terminal.customTheme.color.background': '背景',
|
||
'terminal.customTheme.color.foreground': '前景',
|
||
'terminal.customTheme.color.cursor': '光标',
|
||
'terminal.customTheme.color.selection': '选区',
|
||
'terminal.customTheme.color.black': '黑色',
|
||
'terminal.customTheme.color.red': '红色',
|
||
'terminal.customTheme.color.green': '绿色',
|
||
'terminal.customTheme.color.yellow': '黄色',
|
||
'terminal.customTheme.color.blue': '蓝色',
|
||
'terminal.customTheme.color.magenta': '品红',
|
||
'terminal.customTheme.color.cyan': '青色',
|
||
'terminal.customTheme.color.white': '白色',
|
||
'terminal.customTheme.color.brightBlack': '亮黑',
|
||
'terminal.customTheme.color.brightRed': '亮红',
|
||
'terminal.customTheme.color.brightGreen': '亮绿',
|
||
'terminal.customTheme.color.brightYellow': '亮黄',
|
||
'terminal.customTheme.color.brightBlue': '亮蓝',
|
||
'terminal.customTheme.color.brightMagenta': '亮品红',
|
||
'terminal.customTheme.color.brightCyan': '亮青色',
|
||
'terminal.customTheme.color.brightWhite': '亮白',
|
||
|
||
'cloudSync.gate.title': '端到端加密同步',
|
||
'cloudSync.gate.desc':
|
||
'数据会在本地加密后再同步,云端不会看到明文。设置主密钥以启用安全同步。',
|
||
'cloudSync.gate.masterKey': '主密钥',
|
||
'cloudSync.gate.confirmMasterKey': '确认主密钥',
|
||
'cloudSync.gate.placeholder': '输入一个强密码',
|
||
'cloudSync.gate.confirmPlaceholder': '再次输入密码',
|
||
'cloudSync.gate.mismatch': '两次输入的密码不一致',
|
||
'cloudSync.gate.warning':
|
||
'我已了解:如果忘记主密钥,数据无法恢复,且没有密码重置功能。',
|
||
'cloudSync.gate.enableVault': '启用加密 Vault',
|
||
'cloudSync.gate.enabledToast': '已启用加密 Vault',
|
||
'cloudSync.gate.setupFailed': '设置主密钥失败',
|
||
'cloudSync.passwordStrength.tooShort': '太短',
|
||
'cloudSync.passwordStrength.weak': '弱',
|
||
'cloudSync.passwordStrength.moderate': '一般',
|
||
'cloudSync.passwordStrength.strong': '强',
|
||
'cloudSync.passwordStrength.veryStrong': '非常强',
|
||
'cloudSync.provider.notConnected': '未连接',
|
||
'cloudSync.provider.sync': '同步',
|
||
'cloudSync.provider.connect': '连接',
|
||
'cloudSync.provider.connecting': '连接中...',
|
||
'cloudSync.provider.webdav': 'WebDAV',
|
||
'cloudSync.provider.webdav.desc': '连接到自建 WebDAV 端点',
|
||
'cloudSync.provider.s3': 'S3 兼容存储',
|
||
'cloudSync.provider.s3.desc': '连接到 S3 兼容对象存储',
|
||
'cloudSync.provider.comingSoon': '即将支持',
|
||
'cloudSync.webdav.title': 'WebDAV 设置',
|
||
'cloudSync.webdav.desc': '配置 WebDAV 端点用于加密同步。',
|
||
'cloudSync.webdav.endpoint': '端点地址',
|
||
'cloudSync.webdav.authType': '认证方式',
|
||
'cloudSync.webdav.auth.basic': 'Basic',
|
||
'cloudSync.webdav.auth.digest': 'Digest',
|
||
'cloudSync.webdav.auth.token': 'Token',
|
||
'cloudSync.webdav.username': '用户名',
|
||
'cloudSync.webdav.password': '密码',
|
||
'cloudSync.webdav.token': 'Token',
|
||
'cloudSync.webdav.showSecret': '显示密钥',
|
||
'cloudSync.webdav.allowInsecure': '允许不安全的连接(忽略证书错误)',
|
||
'cloudSync.webdav.validation.endpoint': '请输入有效的 WebDAV 端点。',
|
||
'cloudSync.webdav.validation.credentials': '请输入用户名和密码。',
|
||
'cloudSync.webdav.validation.token': '请输入 Token。',
|
||
'cloudSync.s3.title': 'S3 设置',
|
||
'cloudSync.s3.desc': '连接到 S3 兼容对象存储以进行加密同步。',
|
||
'cloudSync.s3.endpoint': '端点地址',
|
||
'cloudSync.s3.region': 'Region',
|
||
'cloudSync.s3.bucket': 'Bucket',
|
||
'cloudSync.s3.accessKeyId': 'Access Key ID',
|
||
'cloudSync.s3.secretAccessKey': 'Secret Access Key',
|
||
'cloudSync.s3.sessionToken': 'Session Token(可选)',
|
||
'cloudSync.s3.prefix': 'Key 前缀(可选)',
|
||
'cloudSync.s3.forcePathStyle': '强制使用 path-style URL(适用于 MinIO/R2 等)',
|
||
'cloudSync.s3.showSecret': '显示密钥',
|
||
'cloudSync.s3.validation.required': '端点、Region、Bucket、Access Key 与 Secret 必填。',
|
||
'cloudSync.smb.title': 'SMB 设置',
|
||
'cloudSync.smb.desc': '连接到 SMB/CIFS 文件共享以进行加密同步。',
|
||
'cloudSync.smb.share': '共享路径',
|
||
'cloudSync.smb.username': '用户名',
|
||
'cloudSync.smb.password': '密码',
|
||
'cloudSync.smb.domain': '域(可选)',
|
||
'cloudSync.smb.domainPlaceholder': '例如:WORKGROUP',
|
||
'cloudSync.smb.port': '端口(可选)',
|
||
'cloudSync.smb.showSecret': '显示密码',
|
||
'cloudSync.smb.validation.share': '共享路径必填。',
|
||
'cloudSync.smb.validation.port': '端口必须是 1 到 65535 之间的数字。',
|
||
'cloudSync.connect.smb.success': 'SMB 已连接',
|
||
'cloudSync.connect.smb.failedTitle': 'SMB 连接失败',
|
||
'cloudSync.provider.smb': 'SMB 共享',
|
||
'cloudSync.connect.webdav.success': 'WebDAV 已连接',
|
||
'cloudSync.connect.webdav.failedTitle': 'WebDAV 连接失败',
|
||
'cloudSync.connect.s3.success': 'S3 已连接',
|
||
'cloudSync.connect.s3.failedTitle': 'S3 连接失败',
|
||
'cloudSync.lastSync.never': '从未',
|
||
'cloudSync.lastSync.justNow': '刚刚',
|
||
'cloudSync.lastSync.minutesAgo': '{minutes} 分钟前',
|
||
'cloudSync.changeKey': '更改 Key',
|
||
'cloudSync.providers.title': '云服务',
|
||
'cloudSync.syncAll': '同步所有已连接的服务',
|
||
'cloudSync.autoSync.title': '自动同步',
|
||
'cloudSync.autoSync.desc': '发生变更时自动同步',
|
||
'cloudSync.status.title': '同步状态',
|
||
'cloudSync.status.localVersion': '本地版本',
|
||
'cloudSync.status.remoteVersion': '远端版本',
|
||
'cloudSync.history.title': '同步历史',
|
||
'cloudSync.history.upload': '上传',
|
||
'cloudSync.history.download': '下载',
|
||
'cloudSync.history.resolved': '已解决',
|
||
'cloudSync.history.error': '错误',
|
||
'cloudSync.localBackups.title': '本地备份历史',
|
||
'cloudSync.localBackups.desc': 'Netcatty 会在版本变化前,以及恢复主机库前,自动留下一份本地恢复点。',
|
||
'cloudSync.localBackups.retentionTitle': '备份保留数量',
|
||
'cloudSync.localBackups.retentionDesc': '设置 Netcatty 最多保留多少份本地备份。',
|
||
'cloudSync.localBackups.maxCount': '最多保留',
|
||
'cloudSync.localBackups.maxSaved': '已保存保留数量:{count}',
|
||
'cloudSync.localBackups.maxInvalid': '请输入 1 到 100 之间的数字。',
|
||
'cloudSync.localBackups.empty': '还没有本地备份。',
|
||
'cloudSync.localBackups.reason.appVersionChange': '版本变化前',
|
||
'cloudSync.localBackups.reason.beforeRestore': '恢复前',
|
||
'cloudSync.localBackups.versionChange': '{from} -> {to}',
|
||
'cloudSync.localBackups.counts': '{hosts} 台主机,{keys} 个密钥,{snippets} 个代码片段',
|
||
'cloudSync.localBackups.restore': '恢复',
|
||
'cloudSync.localBackups.restoreSuccess': '已恢复本地备份。',
|
||
'cloudSync.localBackups.restoreFailedTitle': '恢复失败',
|
||
'cloudSync.localBackups.restoreMissing': '找不到这份备份。',
|
||
'cloudSync.localBackups.protectiveBackupFailed': '无法创建保护性备份,已中止恢复以避免覆盖当前数据。请先解决底层问题(例如钥匙串访问)后重试。详情:{message}',
|
||
'cloudSync.localBackups.restoreConfirmTitle': '确认恢复此备份?',
|
||
'cloudSync.localBackups.restoreConfirmDesc': '当前的主机、密钥、代码片段与设置将被替换为此备份中的内容。系统会先自动创建一个保护性快照,便于撤销。',
|
||
'cloudSync.localBackups.restoreConfirmButton': '恢复',
|
||
'cloudSync.localBackups.restoreConfirmCancel': '取消',
|
||
'cloudSync.localBackups.unavailableTitle': '无法使用本地备份',
|
||
'cloudSync.localBackups.unavailableDesc': '当前平台未提供受支持的安全密钥库,Netcatty 无法安全地写入本地备份。请在支持系统钥匙串的环境中运行,或改用云同步保留恢复点。',
|
||
'cloudSync.localBackups.lockedTitle': '需要主密钥',
|
||
'cloudSync.localBackups.lockedDesc': '请先配置或解锁主密钥再恢复备份,以确保恢复后的凭据仍保持加密。',
|
||
'cloudSync.revisionHistory.viewButton': '历史版本',
|
||
'cloudSync.revisionHistory.title': '主机库版本历史',
|
||
'cloudSync.revisionHistory.description': '浏览并恢复 Gist 修订历史中的旧版主机库数据。',
|
||
'cloudSync.revisionHistory.empty': '未找到修订记录。',
|
||
'cloudSync.revisionHistory.current': '当前版本',
|
||
'cloudSync.revisionHistory.revision': '修订',
|
||
'cloudSync.revisionHistory.revisionPreview': '修订内容',
|
||
'cloudSync.revisionHistory.device': '设备',
|
||
'cloudSync.revisionHistory.hosts': '主机',
|
||
'cloudSync.revisionHistory.keys': '密钥',
|
||
'cloudSync.revisionHistory.snippets': '代码片段',
|
||
'cloudSync.revisionHistory.identities': '身份',
|
||
'cloudSync.revisionHistory.restoreButton': '恢复此版本',
|
||
'cloudSync.revisionHistory.restored': '已从选中的修订恢复主机库数据。',
|
||
'cloudSync.revisionHistory.revisionNotFound': '修订未找到或不包含主机库数据。',
|
||
'cloudSync.revisionHistory.decryptFailed': '无法解密此修订。可能是使用了不同的主密钥加密的。',
|
||
'cloudSync.changeKey.title': '更改主密钥',
|
||
'cloudSync.changeKey.current': '当前主密钥',
|
||
'cloudSync.changeKey.new': '新的主密钥',
|
||
'cloudSync.changeKey.confirmNew': '确认新的主密钥',
|
||
'cloudSync.changeKey.currentPlaceholder': '输入当前主密钥',
|
||
'cloudSync.changeKey.newPlaceholder': '输入新的主密钥',
|
||
'cloudSync.changeKey.confirmPlaceholder': '再次输入新的主密钥',
|
||
'cloudSync.changeKey.fillAll': '请填写所有字段',
|
||
'cloudSync.changeKey.minLength': '新的主密钥至少 8 个字符',
|
||
'cloudSync.changeKey.notMatch': '两次输入的主密钥不一致',
|
||
'cloudSync.changeKey.incorrectCurrent': '当前主密钥不正确',
|
||
'cloudSync.changeKey.failed': '更改主密钥失败',
|
||
'cloudSync.changeKey.desc': '这将重新加密 Vault,请务必记住新的主密钥。',
|
||
'cloudSync.changeKey.showKeys': '显示主密钥',
|
||
'cloudSync.changeKey.updatedToast': '主密钥已更新',
|
||
'cloudSync.changeKey.updateButton': '更新主密钥',
|
||
'cloudSync.unlock.title': '输入主密钥',
|
||
'cloudSync.unlock.masterKey': '主密钥',
|
||
'cloudSync.unlock.desc': '仅需输入一次主密钥以启用加密同步,之后会通过系统 Keychain 安全存储。',
|
||
'cloudSync.unlock.placeholder': '输入你的主密钥',
|
||
'cloudSync.unlock.empty': '请输入主密钥',
|
||
'cloudSync.unlock.incorrect': '主密钥不正确',
|
||
'cloudSync.unlock.failed': '解锁 Vault 失败',
|
||
'cloudSync.unlock.showKey': '显示主密钥',
|
||
'cloudSync.unlock.notNow': '暂不',
|
||
'cloudSync.unlock.readyToast': 'Vault 已就绪',
|
||
'cloudSync.unlock.unlockButton': '解锁',
|
||
'cloudSync.header.vaultReady': 'Vault 已就绪',
|
||
'cloudSync.header.preparingVault': '正在准备 Vault...',
|
||
'cloudSync.header.providersConnected': '已连接 {count} 个 provider',
|
||
'cloudSync.githubFlow.title': '连接到 GitHub',
|
||
'cloudSync.githubFlow.desc': '复制下面的 code,并在 GitHub 页面输入以授权 Netcatty。',
|
||
'cloudSync.githubFlow.copyCode': '复制 code',
|
||
'cloudSync.githubFlow.copied': '已复制',
|
||
'cloudSync.githubFlow.openGitHub': '打开 GitHub',
|
||
'cloudSync.githubFlow.waiting': '等待授权...',
|
||
'cloudSync.conflict.title': '检测到版本冲突',
|
||
'cloudSync.conflict.desc': '选择保留哪个版本',
|
||
'cloudSync.conflict.local': '本地',
|
||
'cloudSync.conflict.cloud': '云端',
|
||
'cloudSync.conflict.keepLocal': '覆盖云端(保留本地)',
|
||
'cloudSync.conflict.useCloud': '下载云端(覆盖本地)',
|
||
'cloudSync.connect.browserContinue': '请在浏览器中完成授权',
|
||
'cloudSync.connect.github.success': 'GitHub 已连接',
|
||
'cloudSync.connect.github.failedTitle': 'GitHub 连接失败',
|
||
'cloudSync.connect.github.timeout': '连接 GitHub 超时,请检查网络或代理设置。',
|
||
'cloudSync.connect.github.networkError': '无法访问 GitHub,请检查网络或代理设置。',
|
||
'cloudSync.connect.google.failedTitle': 'Google 连接失败',
|
||
'cloudSync.connect.onedrive.failedTitle': 'OneDrive 连接失败',
|
||
'cloudSync.sync.success': '已同步到 {provider}',
|
||
'cloudSync.sync.failed': '同步失败',
|
||
'cloudSync.sync.failedTitle': '同步失败',
|
||
'cloudSync.sync.errorTitle': '同步错误',
|
||
'cloudSync.resolve.downloaded': '已下载云端数据',
|
||
'cloudSync.resolve.uploaded': '已上传本地数据',
|
||
'cloudSync.resolve.failedTitle': '冲突处理失败',
|
||
'cloudSync.clearLocal.title': '清空本地数据',
|
||
'cloudSync.clearLocal.desc': '重置本地版本和同步历史。下次同步将从云端下载。',
|
||
'cloudSync.clearLocal.button': '清空',
|
||
'cloudSync.clearLocal.dialog.title': '清空本地 Vault 数据?',
|
||
'cloudSync.clearLocal.dialog.desc': '这将重置本地版本为 0 并清除同步历史。下次同步时会从云端下载数据,替换本地数据。',
|
||
'cloudSync.clearLocal.dialog.cancel': '取消',
|
||
'cloudSync.clearLocal.dialog.confirm': '确认清空',
|
||
'cloudSync.clearLocal.toast.title': '本地数据已清空',
|
||
'cloudSync.clearLocal.toast.desc': '本地版本已重置为 0。同步以从云端下载数据。',
|
||
|
||
// Common (additional)
|
||
'common.searchPlaceholder': '搜索...',
|
||
'common.import': '导入',
|
||
'common.generate': '生成',
|
||
'common.delete': '删除',
|
||
'common.edit': '编辑',
|
||
'common.clear': '清除',
|
||
'common.optional': '可选',
|
||
'common.selectPlaceholder': '请选择...',
|
||
'common.error': '错误',
|
||
'common.validation': '验证',
|
||
'common.saveChanges': '保存修改',
|
||
'common.advanced': '高级',
|
||
'common.selectAHostPlaceholder': '选择主机...',
|
||
|
||
// Actions
|
||
'action.duplicate': '复制',
|
||
'action.open': '打开',
|
||
'action.copy': '复制',
|
||
'action.run': '运行',
|
||
'action.start': '启动',
|
||
'action.stop': '停止',
|
||
|
||
// Port Forwarding (form)
|
||
'pf.form.labelPlaceholder': '规则标签',
|
||
'pf.form.intermediateHost': '中转主机 *',
|
||
'pf.form.createRule': '创建规则',
|
||
'pf.form.openWizard': '打开向导',
|
||
'pf.form.openWizardTitle': '打开端口转发向导',
|
||
'pf.action.newForwarding': '新建转发',
|
||
'pf.view.grid': '网格',
|
||
'pf.view.list': '列表',
|
||
'pf.rule.summary.dynamic': 'SOCKS 监听于 {bindAddress}:{localPort}',
|
||
'pf.rule.summary.default': '{bindAddress}:{localPort} -> {remoteHost}:{remotePort}',
|
||
'pf.tooltip.relayHost': '中转主机',
|
||
'pf.tooltip.hostLabel': '主机',
|
||
'pf.tooltip.hostAddress': '地址',
|
||
'pf.tooltip.noHost': '未配置中转主机',
|
||
'pf.tooltip.localDesc': '本地端口转发:通过 SSH 隧道访问远程服务',
|
||
'pf.tooltip.remoteDesc': '远程端口转发:将本地服务暴露给远程主机',
|
||
'pf.tooltip.dynamicDesc': '动态 SOCKS 代理:通过 SSH 隧道转发流量',
|
||
'pf.deleteActive.title': '删除正在运行的端口转发?',
|
||
'pf.deleteActive.desc': '端口转发规则 "{label}" 当前正在运行。删除前将先关闭转发连接。',
|
||
'pf.deleteActive.confirm': '关闭并删除',
|
||
'pf.form.autoStart': '自动启动',
|
||
'pf.form.autoStartDesc': '应用启动时自动开启此规则',
|
||
|
||
// SFTP (pane + conflict)
|
||
'sftp.pane.local': '本地',
|
||
'sftp.pane.remote': '远端',
|
||
'sftp.pane.selectHost': '选择主机',
|
||
'sftp.pane.selectHostToStart': '先选择一个主机',
|
||
'sftp.pane.chooseFilesystem': '选择要浏览的本地或远端文件系统',
|
||
'sftp.tabs.addTab': '新建标签页',
|
||
'sftp.tabs.closeTab': '关闭标签页',
|
||
'sftp.tabs.newTab': '新标签页',
|
||
'sftp.conflict.title': '文件冲突',
|
||
'sftp.conflict.desc': '目标位置已存在同名文件',
|
||
'sftp.conflict.alreadyExistsSuffix': '已存在',
|
||
'sftp.conflict.existingFile': '已有文件',
|
||
'sftp.conflict.newFile': '新文件',
|
||
'sftp.conflict.size': '大小:',
|
||
'sftp.conflict.modified': '修改时间:',
|
||
'sftp.conflict.applyToAll': '将此操作应用到剩余的 {count} 个冲突',
|
||
'sftp.conflict.action.skip': '跳过',
|
||
'sftp.conflict.action.keepBoth': '保留两者',
|
||
'sftp.conflict.action.replace': '替换',
|
||
|
||
// SFTP Upload Phases
|
||
'sftp.upload.phase.compressing': '正在压缩',
|
||
'sftp.upload.phase.uploading': '正在上传',
|
||
'sftp.upload.phase.extracting': '正在解压',
|
||
'sftp.upload.phase.compressed': '压缩传输',
|
||
|
||
// 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.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.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.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.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.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.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.keywordHighlight.title': '关键字高亮',
|
||
'settings.terminal.keywordHighlight.resetColors': '重置为默认颜色',
|
||
'settings.terminal.keywordHighlight.addCustom': '添加自定义规则',
|
||
'settings.terminal.keywordHighlight.editCustom': '编辑规则',
|
||
'settings.terminal.keywordHighlight.labelField': '标签与颜色',
|
||
'settings.terminal.keywordHighlight.labelPlaceholder': '标签(如 Down)',
|
||
'settings.terminal.keywordHighlight.patternField': '正则表达式',
|
||
'settings.terminal.keywordHighlight.patternPlaceholder': '正则表达式(如 \\bdown\\b)',
|
||
'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.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.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 > 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.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.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': 'Proxy',
|
||
'hostDetails.proxyPanel.hostPlaceholder': 'Proxy host',
|
||
'hostDetails.proxyPanel.credentials': 'Credentials',
|
||
'hostDetails.proxyPanel.usernamePlaceholder': 'Username',
|
||
'hostDetails.proxyPanel.passwordPlaceholder': 'Password',
|
||
'hostDetails.proxyPanel.identities': 'Identities',
|
||
'hostDetails.proxyPanel.remove': '移除 Proxy',
|
||
'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.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.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.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}',
|
||
|
||
// 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': '跳过',
|
||
|
||
// Text Editor
|
||
'sftp.editor.wordWrap': '自动换行',
|
||
|
||
// AI Settings
|
||
'ai.agentSettings': 'Agent 设置',
|
||
'ai.title': 'AI',
|
||
'ai.description': '配置 AI 提供商、Agent 和安全设置',
|
||
'ai.providers': '提供商',
|
||
'ai.providers.empty': '尚未配置提供商。添加一个提供商以开始使用。',
|
||
'ai.providers.add': '添加提供商',
|
||
'ai.providers.active': '活跃',
|
||
'ai.providers.apiKeyConfigured': 'API Key 已配置',
|
||
'ai.providers.noApiKey': '未设置 API Key',
|
||
'ai.providers.configure': '配置',
|
||
'ai.providers.remove': '移除',
|
||
'ai.providers.name': '显示名称',
|
||
'ai.providers.name.placeholder': '例如 我的提供商',
|
||
'ai.providers.apiKey': 'API Key',
|
||
'ai.providers.apiKey.placeholder': '输入 API Key',
|
||
'ai.providers.apiKey.decrypting': '解密中...',
|
||
'ai.providers.baseUrl': 'Base URL',
|
||
'ai.providers.skipTLSVerify': '跳过 TLS 证书验证(用于自签名证书)',
|
||
'ai.providers.defaultModel': '默认模型',
|
||
'ai.providers.defaultModel.placeholder': '例如 gpt-4o, claude-sonnet-4-20250514',
|
||
'ai.providers.refreshModels': '刷新模型列表',
|
||
'ai.providers.searchModel': '搜索或输入模型 ID...',
|
||
'ai.providers.filterModels': '筛选模型...',
|
||
'ai.providers.loadingModels': '加载模型中...',
|
||
'ai.providers.noMatchingModels': '没有匹配的模型',
|
||
'ai.providers.clickToLoadModels': '点击加载模型',
|
||
'ai.providers.showingModels': '显示前 100 个,共 {count} 个模型。输入以筛选。',
|
||
'ai.providers.advancedParams': '高级参数',
|
||
'ai.providers.advancedParams.hint': '留空则使用提供商默认值。',
|
||
'ai.providers.advancedParams.maxTokens.placeholder': '例如 4096',
|
||
'ai.providers.advancedParams.default': '提供商默认',
|
||
|
||
// AI Codex
|
||
'ai.codex': 'Codex',
|
||
'ai.codex.title': 'Codex CLI',
|
||
'ai.codex.description': '使用 codex + codex-acp 进行 ACP 协议流式传输。可以在这里连接 ChatGPT,也可以在设置里启用兼容 OpenAI 的 API Key 和自定义接口地址。',
|
||
'ai.codex.detecting': '检测中...',
|
||
'ai.codex.notFound': '未找到',
|
||
'ai.codex.awaitingLogin': '等待登录',
|
||
'ai.codex.connectedChatGPT': '已通过 ChatGPT 连接',
|
||
'ai.codex.connectedApiKey': '已通过 API Key 连接',
|
||
'ai.codex.connectedCustomConfig': '使用 ~/.codex/config.toml 自定义 provider',
|
||
'ai.codex.customConfigIncomplete': '检测到自定义配置(缺少环境变量)',
|
||
'ai.codex.customConfigHint': '使用 ~/.codex/config.toml 中配置的自定义 provider "{provider}",无需 ChatGPT 登录。',
|
||
'ai.codex.customConfigMissingEnvKey': '警告:环境变量 {envKey} 未在当前 shell 中设置。请 export 它(或从包含该变量的 shell 启动 netcatty),否则 Codex 无法鉴权。',
|
||
'ai.codex.notConnected': '未连接',
|
||
'ai.codex.statusUnknown': '状态未知',
|
||
'ai.codex.path': '路径:',
|
||
'ai.codex.notFoundHint': '在 PATH 中未找到 codex。请安装或在下方指定可执行文件路径。',
|
||
'ai.codex.customPathPlaceholder': '例如 /usr/local/bin/codex',
|
||
'ai.codex.check': '检查',
|
||
'ai.codex.openLogin': '打开登录',
|
||
'ai.codex.logout': '退出登录',
|
||
'ai.codex.connectChatGPT': '连接 ChatGPT',
|
||
'ai.codex.refreshStatus': '刷新状态',
|
||
|
||
// AI Claude Code
|
||
'ai.claude.title': 'Claude Code',
|
||
'ai.claude.description': 'Anthropic 的智能编程助手。使用 claude-agent-acp 进行 ACP 协议流式传输。',
|
||
'ai.claude.detecting': '检测中...',
|
||
'ai.claude.detected': '已检测到',
|
||
'ai.claude.notFound': '未找到',
|
||
'ai.claude.path': '路径:',
|
||
'ai.claude.notFoundHint': '在 PATH 中未找到 claude。请安装或在下方指定可执行文件路径。',
|
||
'ai.claude.customPathPlaceholder': '例如 /usr/local/bin/claude',
|
||
'ai.claude.check': '检查',
|
||
|
||
// AI GitHub Copilot CLI
|
||
'ai.copilot.title': 'GitHub Copilot CLI',
|
||
'ai.copilot.description': '通过 ACP over stdio(`copilot --acp --stdio`)接入 GitHub Copilot CLI。检测到后即可作为外部编程 Agent 使用。',
|
||
'ai.copilot.detecting': '检测中...',
|
||
'ai.copilot.detected': '已检测到',
|
||
'ai.copilot.notFound': '未找到',
|
||
'ai.copilot.path': '路径:',
|
||
'ai.copilot.notFoundHint': '在 PATH 中未找到 copilot。请安装或在下方指定可执行文件路径。',
|
||
'ai.copilot.customPathPlaceholder': '例如 /usr/local/bin/copilot',
|
||
'ai.copilot.check': '检查',
|
||
|
||
// AI Default Agent
|
||
'ai.defaultAgent': '默认 Agent',
|
||
'ai.defaultAgent.description': '创建新 AI 会话时使用的 Agent',
|
||
'ai.defaultAgent.catty': 'Catty(内置)',
|
||
'ai.toolAccess.title': '工具接入',
|
||
'ai.toolAccess.mode': 'Netcatty 接入模式',
|
||
'ai.toolAccess.description': '选择外部 ACP Agent 访问 Netcatty 会话的方式。MCP 会暴露内置服务器,Skills + CLI 会引导 Agent 读取本地 Skill 并调用 Netcatty CLI。',
|
||
'ai.toolAccess.mode.mcp': 'MCP',
|
||
'ai.toolAccess.mode.skills': 'Skills + CLI',
|
||
'ai.userSkills.title': '用户 Skills',
|
||
'ai.userSkills.description': '打开 Netcatty 的 Skills 文件夹以添加你自己的技能目录。Netcatty 会自动扫描这些 skills,默认只注入轻量索引,只有在请求明显命中某个 skill 时才展开正文。',
|
||
'ai.userSkills.openFolder': '打开 Skills 文件夹',
|
||
'ai.userSkills.reload': '重新加载 Skills',
|
||
'ai.userSkills.location': '位置',
|
||
'ai.userSkills.loading': '正在扫描用户 skills...',
|
||
'ai.userSkills.summary': '已就绪 {ready} 个,警告 {warnings} 个',
|
||
'ai.userSkills.empty': '暂未发现用户 skills。打开文件夹后可添加包含 SKILL.md 的技能目录。',
|
||
'ai.userSkills.unavailable': '当前环境不支持用户 skills。',
|
||
'ai.userSkills.status.ready': '正常',
|
||
'ai.userSkills.status.warning': '警告',
|
||
|
||
// AI Chat
|
||
'ai.chat.noProvider': '尚未配置 AI 提供商。请前往 **设置 → AI → 提供商** 添加并启用一个提供商。',
|
||
'ai.chat.toolDenied': '操作已被用户拒绝。',
|
||
'ai.chat.toolApproved': '已批准',
|
||
'ai.chat.toolApprovalHint': '按回车批准,按 Esc 拒绝',
|
||
'ai.chat.approve': '批准',
|
||
'ai.chat.reject': '拒绝',
|
||
'ai.chat.toolLabel': '工具',
|
||
'ai.chat.targetLabel': '目标',
|
||
'ai.chat.permissionRequired': '需要权限',
|
||
'ai.chat.permissionDescription': 'AI Agent 希望执行一个需要你批准的工具调用。',
|
||
'ai.chat.commandBlocked': '此命令已被安全策略拦截,无法执行。',
|
||
'ai.chat.recommendAllow': '允许',
|
||
'ai.chat.recommendConfirm': '确认',
|
||
'ai.chat.recommendDeny': '拒绝',
|
||
'ai.chat.exportConversation': '导出对话',
|
||
'ai.chat.exportAs': '导出为',
|
||
'ai.chat.exportMarkdown': 'Markdown',
|
||
'ai.chat.exportJSON': 'JSON',
|
||
'ai.chat.exportPlainText': '纯文本',
|
||
'ai.chat.thinking': '思考中',
|
||
'ai.chat.thoughtFor': '思考了 {duration}',
|
||
'ai.chat.thought': '思考',
|
||
'ai.chat.agents': 'Agents',
|
||
'ai.chat.detectedOnMachine': '在本机检测到',
|
||
'ai.chat.rescan': '重新扫描',
|
||
'ai.chat.permObserver': '观察',
|
||
'ai.chat.permConfirm': '确认',
|
||
'ai.chat.permAuto': '自主',
|
||
'ai.chat.permObserverDesc': '只读模式',
|
||
'ai.chat.permConfirmDesc': '操作前询问',
|
||
'ai.chat.permAutoDesc': '自由执行',
|
||
'ai.chat.emptyHint': '询问服务器相关问题、执行命令或获取配置帮助。',
|
||
'ai.chat.placeholder': '向 {agent} 发送消息 — @ 引用上下文,/ 使用命令',
|
||
'ai.chat.placeholderDefault': '向 Catty Agent 发送消息...',
|
||
'ai.chat.noModel': '未选择模型',
|
||
'ai.chat.recent': '最近',
|
||
'ai.chat.viewAll': '查看全部',
|
||
'ai.chat.untitled': '无标题',
|
||
'ai.chat.justNow': '刚刚',
|
||
'ai.chat.minutesAgo': '{n}分钟前',
|
||
'ai.chat.hoursAgo': '{n}小时前',
|
||
'ai.chat.daysAgo': '{n}天前',
|
||
'ai.chat.newChat': '新对话',
|
||
'ai.chat.allSessions': '所有会话',
|
||
'ai.chat.noSessions': '没有历史会话',
|
||
'ai.chat.retryHint': '你可以重新发送消息来重试。',
|
||
'ai.chat.approvalTimeout': '工具审批已超时(5 分钟)。你可以重新发送消息来重试。',
|
||
'ai.chat.menuHosts': '主机',
|
||
'ai.chat.menuContext': '上下文',
|
||
'ai.chat.menuFiles': '文件',
|
||
'ai.chat.menuImage': '图片',
|
||
'ai.chat.menuMentionHost': '提及主机',
|
||
'ai.chat.menuUserSkills': '用户 Skills',
|
||
|
||
// AI Error
|
||
'ai.codex.bridgeError': 'Codex 主进程处理器尚未加载。请完全重启 Netcatty 或重启 Electron 开发进程,然后重试。',
|
||
|
||
// AI Web Search
|
||
'ai.webSearch.title': '网络搜索',
|
||
'ai.webSearch.enable': '启用网络搜索',
|
||
'ai.webSearch.enable.description': '允许 AI 代理搜索互联网获取最新信息。',
|
||
'ai.webSearch.provider': '搜索供应商',
|
||
'ai.webSearch.provider.description': '选择一个网络搜索 API 供应商。',
|
||
'ai.webSearch.apiKey': 'API 密钥',
|
||
'ai.webSearch.apiKey.description': '所选搜索供应商的 API 密钥。',
|
||
'ai.webSearch.apiKey.placeholder': '输入 API 密钥...',
|
||
'ai.webSearch.apiHost': 'API 地址',
|
||
'ai.webSearch.apiHost.description': '自定义 API 端点。除非使用代理,否则保持默认值。',
|
||
'ai.webSearch.apiHost.searxngDescription': 'SearXNG 实例的 URL(必填)。',
|
||
'ai.webSearch.maxResults': '最大结果数',
|
||
'ai.webSearch.maxResults.description': '搜索返回的最大结果数(1-20)。',
|
||
|
||
// AI Safety Settings
|
||
'ai.safety.title': '安全',
|
||
'ai.safety.permissionMode': '权限模式',
|
||
'ai.safety.permissionMode.description': '控制 AI 与终端的交互方式。观察者模式会通过 Netcatty 阻止所有写操作,对内置和 ACP Agent 均生效。确认模式对 ACP Agent 仅为建议性(ACP Agent 有自己的工具审批流程)。',
|
||
'ai.safety.permissionMode.observer': '观察者 - 只读,禁止操作',
|
||
'ai.safety.permissionMode.confirm': '确认 - 操作前询问',
|
||
'ai.safety.permissionMode.autonomous': '自主 - 自由执行',
|
||
'ai.safety.commandTimeout': '命令超时',
|
||
'ai.safety.commandTimeout.description': '命令执行的最大秒数,超时将被终止。对内置和 ACP Agent 均生效。',
|
||
'ai.safety.commandTimeout.unit': '秒',
|
||
'ai.safety.maxIterations': '最大迭代次数',
|
||
'ai.safety.maxIterations.description': '防止 AI 失控执行的最大工具调用循环次数。ACP Agent 可能有自己的内部迭代限制,以其为准。',
|
||
'ai.safety.blocklist': '命令黑名单',
|
||
'ai.safety.blocklist.description': '用于拦截危险命令的正则表达式。通过 Netcatty 执行层对内置和 ACP Agent 均生效。',
|
||
'ai.safety.blocklist.placeholder': '正则表达式...',
|
||
'ai.safety.blocklist.reset': '恢复默认',
|
||
'ai.safety.blocklist.add': '添加规则',
|
||
'ai.safety.note': '命令黑名单、命令超时和观察者模式通过 MCP Server 层强制执行,对所有 Agent 类型生效。确认模式和最大迭代次数对内置 Agent 完全强制执行;ACP Agent 可能有自己的内部控制。',
|
||
};
|
||
|
||
export default zhCN;
|