feat(i18n): add multi-language support (ja/ko/vi/ru/zh-TW) with system auto-detection

- Extend AppLanguage to 7 locales: zh-CN, zh-TW, en, ja, ko, vi, ru
- Auto-detect system language via navigator.languages; fallback to English
- Add BCP47 locale mapping for date formatting and sorting
- Create 50 translation JSON files (5 languages × 10 namespaces, 1137 keys each)
- Update language selector with native language names
- Extend locale key parity test to cover all 7 languages (70 assertions)
- Add VNC/RDP desktop, serial terminal, AI agent, port forwarding, and SFTP features
- Add credential encryption, host metrics, session backup crypto, and zmodem bridge
- Update Rust backend: desktop services, host metrics, SSH/SFTP enhancements
This commit is contained in:
Logan.Li committed 2026-08-12 00:07:48 +08:00
1 parent fea6d8db04
commit b0d0e3a5f3
301 files changed
+28002 -2705

No files matched your search

+87
View File
@@ -0,0 +1,87 @@
{
"panel": {
"title": "Agent CLI",
"modelConfigured": "{{provider}} · {{model}}",
"modelNotConfigured": "未配置模型",
"sshReady": "SSH · {{target}}",
"sshNotConnected": "未连接远程 SSH",
"defaultTarget": "当前 SSH 会话",
"emptyHint": "描述运维任务后发送。可连续追问,或点 + 开新话题。",
"newTopic": "新话题",
"close": "关闭",
"thinking": "思考中…",
"conclusion": "结论",
"copy": "复制",
"copied": "已复制",
"stop": "停止",
"send": "发送",
"placeholder": "任务或追问…(Enter 发送,Shift+Enter 换行)",
"hintFollowUp": "继续追问将带上本轮上下文",
"hintSelection": "将附带选中 {{lines}} 行",
"hintSteps": "最多 {{max}} 步 · 不落盘",
"footerNote": "高风险需确认 · critical 拒绝 · 会话不落盘"
},
"safety": {
"aria": "Agent 安全模式",
"strict": {
"label": "严格",
"short": "中风险起确认",
"description": "文件修改、权限调整及更高风险命令需要确认,适合生产或陌生主机。"
},
"relaxed": {
"label": "宽松",
"short": "仅高风险确认",
"description": "查看和普通修改自动执行;删除、重启、安装等高风险操作需要确认。"
}
},
"risk": {
"safe": "安全",
"low": "低风险",
"medium": "中风险",
"high": "高风险",
"critical": "禁止执行"
},
"step": {
"round": "第 {{round}} 步",
"awaiting": "待确认",
"running": "执行中",
"done": "完成",
"confirmTitle": "第 {{round}} 步 · {{risk}}",
"confirmMessage": "SSH · {{target}}\n{{mode}}\n\n$ {{command}}",
"rejected": "已拒绝第 {{round}} 步命令。",
"terminated": "已终止",
"stoppedMessage": "已终止。正在执行的远端命令已请求中断。"
},
"confirm": {
"reject": "Reject",
"once": "Once",
"always": "Always",
"hint": "Enter · Once Esc · Reject Always · 本会话同类命令不再确认"
},
"error": {
"noProvider": "请先在设置 → 大模型配置 Provider",
"noApiKey": "「{{provider}}」尚未保存 API Key",
"emptyTask": "请输入任务或追问",
"sshRequired": "需要已连接的远程 SSH",
"modelEmpty": "模型未返回内容",
"protocolFailed": "模型连续两次未遵循协议,已停止",
"noConclusion": "模型未返回可用结论",
"multipleCommands": "模型一次返回了多个命令,已拒绝执行",
"invalidCommand": "模型未返回唯一的单行命令,已拒绝执行",
"repeatLoop": "检测到重复命令循环,已停止:{{command}}",
"criticalBlocked": "命令命中破坏性操作硬红线,不提供确认放行:{{command}}",
"execFailed": "ssh-exec 失败:{{error}}",
"execUnknown": "未知错误",
"execNoOutput": "命令执行完成,无输出",
"maxSteps": "已达 {{max}} 步上限,请缩小范围后重试"
},
"output": {
"empty": "(空输出)",
"truncatedMiddle": "... [已省略 {{count}} 行] ...",
"totalLines": "总行数: {{count}}{{truncatedSuffix}}",
"truncatedSuffix": "(已截断保留首尾)",
"errorLines": "疑似错误/告警行 ({{count}}):\n{{lines}}",
"noErrorKeywords": "未发现明显错误关键词",
"snippetLabel": "输出片段:\n{{snippet}}"
}
}
+326
View File
@@ -0,0 +1,326 @@
{
"action": {
"confirm": "确认",
"cancel": "取消",
"close": "关闭",
"delete": "删除",
"save": "保存",
"create": "创建",
"copy": "复制",
"copied": "已复制",
"refresh": "刷新",
"gotIt": "知道了",
"edit": "编辑",
"open": "打开",
"clone": "克隆",
"reconnect": "重连",
"disconnect": "断开",
"submit": "确定"
},
"status": {
"loading": "加载中...",
"processing": "处理中...",
"connecting": "连接中...",
"connected": "已连接",
"disconnected": "未连接",
"background": "后台",
"suspended": "已挂起",
"reconnecting": "重连中",
"error": "连接错误",
"reading": "读取中...",
"saving": "保存中..."
},
"error": {
"title": "出错了",
"body": "应用遇到意外问题",
"recoverable": "此错误可以恢复,请尝试刷新页面",
"refreshPage": "刷新页面",
"restartApp": "重启应用",
"supportHint": "如果问题持续存在,请检查日志或联系支持"
},
"toast": {
"closeAria": "关闭通知"
},
"metrics": {
"timezone": "时区 {{value}}",
"memory": "内存 {{percent}}%{{detail}}",
"sessionTransfer": "会话流量 {{value}}"
},
"palette": {
"title": "命令面板",
"aria": "命令面板",
"placeholder": "搜索命令、会话或片段...",
"empty": "没有找到匹配的结果",
"emptyHint": "试试其他关键词",
"resultCount": "{{count}} 个结果",
"badge": {
"command": "命令",
"session": "会话",
"snippet": "片段"
},
"hint": {
"nav": "导航",
"run": "执行",
"close": "关闭"
},
"cmd": {
"newSession": "新建会话",
"newSessionDesc": "创建新的 SSH 会话配置",
"quickConnect": "快速连接",
"quickConnectDesc": "直接输入主机信息连接",
"localTerminal": "本地终端",
"localTerminalDesc": "打开本机 Shell",
"settings": "打开设置",
"settingsDesc": "应用偏好设置",
"toggleSidebar": "折叠/展开侧栏",
"toggleSidebarDesc": "隐藏侧栏以专心操作终端",
"newTab": "新建标签页",
"closeTab": "关闭当前标签",
"closeAllTabs": "关闭所有标签",
"portForward": "新建端口转发",
"upgradePro": "升级 OpsXShell Pro",
"editSession": "编辑会话: {{name}}"
}
},
"tab": {
"welcome": "欢迎",
"new": "新标签",
"settings": "设置",
"portForward": "端口转发",
"terminal": "终端",
"batch": "批量执行",
"newTerminal": "新终端",
"kind": {
"terminal": "终端",
"sftp": "SFTP",
"portforward": "转发",
"serial": "串口",
"rdp": "RDP",
"vnc": "VNC",
"batch": "批量",
"settings": "设置"
},
"menu": {
"closeOthers": "关闭其他",
"closeRight": "关闭右侧标签",
"closeLeft": "关闭左侧标签",
"closeAll": "关闭全部",
"clone": "克隆标签"
}
},
"sidebar": {
"brandSub": "SSH / SFTP 终端",
"collapse": "折叠侧栏 (Ctrl/Cmd+B)",
"collapseAria": "折叠侧栏",
"expand": "展开侧栏",
"expandAria": "展开侧栏",
"toggle": "切换侧边栏",
"searchPlaceholder": "搜索...",
"localShell": {
"openDefault": "打开默认本地 Shell",
"choose": "选择 Shell",
"title": "本地 Shell",
"subtitle": "打开本机终端",
"default": "默认"
}
},
"connectionPanel": {
"title": "连接管理",
"empty": "暂无连接",
"emptyDesc": "当前没有任何活跃连接,连接到服务器后将在此显示。",
"stat": {
"total": "总计",
"active": "活跃",
"background": "后台",
"error": "断开/错误"
},
"status": {
"connected": "已连接",
"connecting": "连接中",
"background": "后台",
"suspended": "已挂起",
"error": "错误",
"disconnected": "已断开",
"reconnecting": "重连中"
},
"refCount": "×{{count}} 引用",
"reconnect": "重连",
"reconnecting": "重连中...",
"disconnect": "断开"
},
"pro": {
"upgrade": "升级 Pro",
"feature": "专业功能",
"unlock": "解锁 {{feature}}",
"comingSoon": "即将推出",
"activateSuccess": "激活成功",
"activateFailed": "激活失败",
"licenseActivated": "Pro 许可证已激活",
"paymentPending": "支付完成后请粘贴许可证,或稍后再试激活",
"invalidLicense": "激活失败:许可证无效",
"goUpgrade": "去付费升级",
"haveLicense": "已有许可证?激活",
"title": "OpsXShell Pro · 解锁专业运维能力",
"subtitleComingSoon": "{{feature}} 即将推出 · 升级 Pro 可优先体验",
"subtitleUnlock": "正在解锁:{{feature}}",
"subtitleDefault": "转发、代理、串口、AI、批量与广播",
"activated": "已激活 Pro",
"expiresAt": " · 有效期至 {{date}}",
"lifetime": " · 终身授权",
"oneTimeFee": "一次性费用 · 本机终身授权 · 无需订阅",
"pasteLicense": "粘贴许可证",
"activateButton": "激活",
"clearLicense": "清除本机许可证",
"paymentNote": "支付由 Waffo 托管收银台处理;本应用不收集或保存银行卡信息。",
"testDeviceId": "测试环境 · 设备 ID:{{deviceId}}",
"later": "稍后再说",
"viewPro": "查看 Pro",
"wallComingSoonSuffix": " · 即将推出",
"wallUnlock": "解锁 {{feature}}",
"wallMessageComingSoon": "该能力属于 OpsXShell Pro,协议实现尚在开发中。升级后可优先体验。",
"wallMessageDefault": "此功能属于 OpsXShell Pro。升级后即可在本机使用。",
"checkoutUnavailable": "结账服务不可用 ({{status}})",
"freeTier": "Free",
"proTier": "Pro",
"freeItems": {
"ssh": "SSH 终端",
"sftp": "SFTP 文件管理",
"local": "本地终端",
"crud": "会话 CRUD",
"import": "单条 / ssh_config 导入"
},
"proItems": {
"forward": "端口转发",
"proxy": "会话代理 / SOCKS",
"serial": "串口终端",
"ai": "终端 AI 助手",
"batch": "批量执行 / 广播同步",
"broadcast": "广播同步输入",
"importExport": "批量导入导出主机清单",
"desktop": "RDP / VNC 远程桌面"
}
},
"launcher": {
"title": "快速启动",
"description": "会话、本地 Shell 与设备控制台统一入口",
"cards": {
"quickConnect": { "title": "快速连接", "desc": "user@host:port" },
"saveSession": { "title": "保存会话", "desc": "凭据、分组、代理" },
"serial": { "title": "串口终端", "desc": "波特率与串口参数" }
},
"sectionLocalShell": "本地 Shell",
"sectionSavedSessions": "保存会话",
"systemDefault": "系统默认"
},
"statusBar": {
"socksLabel": "转发",
"socksIdle": "打开端口转发 · 右键复制 SOCKS 地址",
"socksRunning": "SOCKS5 运行中 · 点击管理 · 右键复制",
"forwardOpenIdle": "打开端口转发 · 右键复制 socks5://127.0.0.1:{{port}}",
"forwardOpenRunning": "SOCKS5 已开(:{{port}})· 点击管理 · 右键复制",
"forwardStarted": "转发已启动",
"forwardStartedDynamic": "SOCKS5 已启动:socks5://127.0.0.1:{{port}}",
"socksStartFailed": "启动失败:{{message}}",
"socksStopFailed": "停止失败:{{message}}",
"socksCopied": "已复制 socks5://127.0.0.1:{{port}}"
},
"portForward": {
"title": "端口转发",
"connectedAs": "已连接:{{target}}",
"notConnected": "未连接 — 请先建立 SSH 连接",
"socksDefaultHint": "本机 SOCKS5:127.0.0.1:1080",
"socksRunning": "SOCKS5 运行中",
"socksStart": "启动 SOCKS5",
"addRule": "添加",
"emptyTitle": "暂无端口转发",
"emptyDesc": "可启动 SOCKS5,或添加本地 / 远程规则",
"emptyAction": "启动 127.0.0.1:1080",
"typeLocal": "本地",
"typeRemote": "远程",
"typeDynamic": "动态",
"running": "运行中",
"socksProxy": "SOCKS5:127.0.0.1:{{port}}",
"remoteToLocal": "远端 {{remote}} → 本机 {{local}}",
"stats": "{{connections}} 连接 · ↑{{up}} · ↓{{down}}",
"copyProxy": "复制代理",
"copyRule": "复制规则",
"editRule": "编辑",
"stopListener": "停止",
"start": "启动",
"delete": "删除",
"editTitle": "编辑转发",
"addTitle": "添加转发",
"typeLocalDesc": "本机 → 远端",
"typeRemoteDesc": "远端 → 本机",
"typeDynamicDesc": "SOCKS5",
"selectType": "转发类型",
"drawerSubtitle": "经当前 SSH 建立隧道",
"ruleFields": "参数",
"dynamicHint": "本机 SOCKS5,默认 127.0.0.1:1080;端口可改。流量经当前 SSH 服务器出口 IP 访问外网。",
"dynamicSingleHint": "每台 SSH 仅一条动态转发;停止后可改监听端口。",
"dynamicPortHint": "端口被占用时可改为其他本机端口(如 1081)。",
"ruleList": "规则",
"ruleListEmpty": "暂无本地 / 远程规则",
"addSection": "新建",
"errorDynamicExists": "动态转发已存在,请直接启停或修改端口。",
"diagram": {
"title": "流量示意",
"localApp": "本机应用",
"sshHost": "SSH 主机",
"remoteService": "远端服务",
"remoteClient": "远端访问方",
"localService": "本机服务",
"localClient": "本机",
"browser": "本机客户端",
"socksProxy": "本机 SOCKS",
"anyTarget": "任意目标",
"localSide": "本机",
"remoteSide": "远端",
"firewall": "防火墙",
"viaApp": "经 OpsXShell",
"viaSsh": "经 SSH",
"toTarget": "到目标",
"toListen": "到监听",
"targetDb": "DB",
"targetWeb": "Web",
"targetApi": "API",
"remotePeerA": "远端 A",
"remotePeerB": "远端 B",
"remotePeerC": "远端 C",
"cloudA": "云 A",
"cloudB": "云 B",
"internet": "互联网",
"localCaption": "本地转发:经隧道访问远端端口,如同访问本机。",
"remoteCaption": "远程转发:远端访问经隧道转到本机服务。",
"dynamicCaption": "动态转发:本机变成 SOCKS5 代理,可经当前 SSH 服务器出口 IP 访问互联网。"
},
"ruleName": "名称",
"ruleNamePlaceholder": "例如 MySQL",
"localListenPort": "本机监听端口",
"localTargetPort": "本机目标端口",
"remoteTargetPort": "远端目标端口",
"remoteListenPort": "远端监听端口",
"portPlaceholder": "如 3306",
"remoteHost": "远端主机",
"remoteHostPlaceholder": "localhost 或 IP",
"socksRuleName": "SOCKS5 代理",
"defaultLocalName": "本地转发",
"defaultRemoteName": "远程转发",
"sessionRestoredTitle": "会话已恢复",
"sessionRestoredDesc": "上次关闭时的端口转发标签已恢复\n需要重新建立 SSH 连接才能使用",
"stopEditTitle": "停止后编辑",
"stopEditMessage": "转发运行中,编辑前需先停止。是否继续?",
"stopEditConfirm": "停止并编辑",
"deleteTitle": "确认删除",
"deleteRunning": "转发运行中,将先停止再删除。",
"deleteConfirm": "确定删除此规则?",
"errorNamePort": "请填写名称和有效端口(1–65535)",
"errorTargetPort": "请填写有效目标端口(1–65535)",
"errorRemoteHost": "请填写远端主机",
"errorNotConnected": "未连接到服务器",
"errorStartFailed": "启动失败",
"errorStopFailed": "停止失败",
"errorSocksRunning": "SOCKS5 已在运行",
"copySuffix": "副本"
}
}
+44
View File
@@ -0,0 +1,44 @@
{
"connect": {
"rdpTitle": "连接 RDP",
"vncTitle": "连接 VNC",
"rdpDesc": "Windows 远程桌面 · 原生 IronRDP 引擎",
"vncDesc": "VNC / RFB 远程桌面 · 原生引擎",
"confirm": "连接",
"host": "主机",
"hostPlaceholderRdp": "windows.example.com",
"hostPlaceholderVnc": "192.168.1.10",
"port": "端口",
"username": "用户名",
"domain": "域名(可选)",
"password": "密码",
"passwordOptional": "密码(可选)",
"width": "宽度",
"height": "高度",
"rdpFootnote": "原生 IronRDP:TCP → X.224 → TLS → CredSSP/NLA → MCS;握手超时 45s。证书校验当前为开发期宽松模式。",
"vncFootnote": "原生 vnc-rs RFB:支持 Tight JPEG 帧解码;剪贴板按 UTF-8 发送(极旧服务端可能乱码)。",
"errorHostRequired": "请输入主机地址",
"errorUsernameRequired": "请输入用户名"
},
"toolbar": {
"pasteClipboard": "粘贴本机剪贴板到远端",
"pasteAria": "粘贴到远端",
"shareDrive": "把本地文件复制到共享盘(本机「下载」= 远端「Downloads on OpsXShell」)",
"shareDriveAria": "放入共享盘",
"openShareDir": "在本机打开共享目录(下载文件夹)",
"openShareDirAria": "打开共享目录",
"disconnect": "断开连接",
"disconnectAria": "断开连接"
},
"status": {
"connecting": "正在连接…",
"connected": "已连接",
"disconnected": "已断开",
"connectFailed": "连接失败",
"clipboardSynced": "已同步远端剪贴板",
"savedToDownloads": "已保存到本机下载文件夹:{{name}}",
"pastedToRemote": "已粘贴到远端",
"fileTooLarge": "单文件上限 50MB",
"fileShared": "已放入共享盘「下载」:{{name}}(远端此电脑可见)"
}
}
+161
View File
@@ -0,0 +1,161 @@
{
"code": {
"1000": "连接失败,请检查网络或主机地址",
"1001": "连接超时,请检查网络或稍后重试",
"1002": "认证失败,请检查用户名和密码",
"1003": "主机不可达,请检查网络配置",
"1004": "连接已关闭",
"1100": "终端创建失败",
"1101": "命令执行失败",
"1102": "端口转发设置失败",
"1200": "SFTP 连接失败",
"1201": "文件不存在",
"1202": "权限不足,无法访问该文件或目录",
"1203": "文件传输失败",
"1204": "无法读取目录内容",
"1300": "会话不存在",
"1301": "保存会话失败",
"1302": "加载会话失败",
"1400": "主机地址格式不正确",
"1401": "端口号必须在 1-65535 之间",
"1402": "凭据格式不正确",
"9000": "发生未知错误",
"9001": "内部通信错误",
"9002": "文件系统错误",
"9003": "网络错误"
},
"action": {
"retry": "重试",
"reconnect": "重新连接",
"ignore": "忽略",
"exit": "退出",
"none": "无"
},
"connection": {
"failed": "连接失败,请检查网络或主机地址",
"timeout": "连接超时,请检查网络或稍后重试",
"authFailed": "认证失败,请检查用户名和密码",
"hostUnreachable": "主机不可达,请检查网络配置",
"closed": "连接已关闭",
"dnsFailed": "无法解析主机",
"refused": "连接被拒绝",
"disconnected": "连接已断开"
},
"auth": {
"failed": "认证失败,请检查用户名和密码",
"invalidCredentials": "凭据格式不正确",
"keyLoadFailed": "无法加载私钥",
"passphraseRequired": "私钥需要口令",
"passphraseWrong": "私钥口令不正确"
},
"shell": {
"createFailed": "终端创建失败",
"execFailed": "命令执行失败",
"localCreateFailed": "创建本地 Shell 失败",
"remoteCreateFailed": "创建远端 Shell 失败"
},
"proxy": {
"connectFailed": "代理连接失败",
"authFailed": "代理认证失败",
"tunnelFailed": "代理隧道建立失败",
"unsupported": "不支持的代理类型",
"jumpFailed": "跳板机连接失败",
"hostRequired": "代理 host 不能为空",
"hostNoSpaces": "代理 host 不能包含空格",
"portRequired": "代理 port 必须大于 0",
"portTooHigh": "代理 port 不能超过 65535"
},
"forward": {
"failed": "端口转发设置失败",
"bindFailed": "端口绑定失败",
"alreadyInUse": "端口已被占用"
},
"sftp": {
"connectFailed": "SFTP 连接失败",
"fileNotFound": "文件不存在",
"permissionDenied": "权限不足,无法访问该文件或目录",
"transferFailed": "文件传输失败",
"listFailed": "无法读取目录内容",
"readFailed": "读取失败",
"writeFailed": "保存失败",
"renameFailed": "重命名失败",
"chmodFailed": "权限修改失败",
"apiUnavailable": "SFTP API 不可用"
},
"session": {
"notFound": "会话不存在",
"saveFailed": "保存会话失败",
"loadFailed": "加载会话失败",
"readConfigFailed": "无法读取会话配置",
"exportWriteFailed": "写入导出文件失败",
"exportFailed": "导出会话失败",
"importReadFailed": "读取文件失败",
"importFailed": "导入会话失败",
"importEmpty": "未找到可导入的会话"
},
"validation": {
"invalidHost": "主机地址格式不正确",
"invalidPort": "端口号必须在 1-65535 之间",
"invalidCredentials": "凭据格式不正确",
"hostRequired": "请输入主机地址",
"usernameRequired": "请输入用户名",
"targetRequired": "请输入主机,例如 root@192.168.1.10 或 opsbase.cn:5555",
"serialPathRequired": "请输入串口设备路径",
"taskRequired": "请输入任务或追问"
},
"filesystem": {
"error": "文件系统错误",
"readFailed": "读取文件失败",
"writeFailed": "写入文件失败"
},
"clipboard": {
"readFailed": "读取剪贴板失败",
"writeFailed": "写入剪贴板失败",
"copyPathFailed": "复制路径失败",
"unsupportedRead": "当前环境不支持读取剪贴板",
"unsupportedWrite": "当前环境不支持写入剪贴板"
},
"ipc": {
"error": "内部通信错误",
"nativeApiUnavailable": "原生 API 不可用"
},
"network": {
"error": "网络错误"
},
"pool": {
"limitReached": "连接数达到上限 ({{max}}),请先关闭一些连接"
},
"desktop": {
"connectFailed": "连接失败",
"fileTooLarge": "单文件上限 50MB",
"nativeOnly": "远程连接仅在 OpsXShell Tauri 原生应用中可用",
"rdpNativeOnly": "RDP 仅在 OpsXShell Tauri 原生应用中可用",
"vncNativeOnly": "VNC 仅在 OpsXShell Tauri 原生应用中可用"
},
"serial": {
"openFailed": "打开串口失败",
"writeFailed": "串口写入失败",
"nativeOnly": "串口仅在 Tauri 原生应用中可用"
},
"ai": {
"noProvider": "请先在设置 → 大模型配置 Provider",
"noApiKey": "「{{provider}}」尚未保存 API Key",
"modelEmpty": "模型未返回内容",
"protocolFailed": "模型连续两次未遵循协议,已停止",
"noConclusion": "模型未返回可用结论",
"multipleCommands": "模型一次返回了多个命令,已拒绝执行",
"invalidCommand": "模型未返回唯一的单行命令,已拒绝执行",
"repeatLoop": "检测到重复命令循环,已停止:{{command}}",
"criticalBlocked": "命令命中破坏性操作硬红线,不提供确认放行:{{command}}",
"execFailed": "ssh-exec 失败:{{error}}",
"maxSteps": "已达 {{max}} 步上限,请缩小范围后重试",
"sshRequired": "需要已连接的远程 SSH"
},
"zmodem": {
"readFailed": "读取失败: {{name}}",
"writeFailed": "写入失败: {{name}}"
},
"unknown": {
"error": "发生未知错误"
}
}
+44
View File
@@ -0,0 +1,44 @@
{
"connect": {
"title": "连接串口",
"description": "原生串口终端 · 适用于路由器、交换机、开发板与调试控制台",
"confirm": "打开串口",
"device": "设备",
"refresh": "刷新",
"devicePlaceholder": "{{path}}",
"noDevicesHint": "未枚举到设备时可直接输入路径,例如 {{examples}}。",
"examplesWindows": "{{default}}、COM3",
"examplesLinux": "{{default}}、/dev/ttyACM0",
"examplesMac": "{{default}}、/dev/tty.usbserial-*",
"baudRate": "波特率",
"dataBits": "数据位",
"stopBits": "停止位",
"parity": "校验",
"parityNone": "无",
"parityOdd": "奇校验",
"parityEven": "偶校验",
"flowControl": "流控",
"flowNone": "无",
"flowSoftware": "软件 XON/XOFF",
"flowHardware": "硬件 RTS/CTS",
"lineEnding": "行尾",
"lineEndingLf": "LF (\\n)",
"lineEndingCr": "CR (\\r)",
"lineEndingCrlf": "CRLF (\\r\\n)",
"localEcho": "本地回显",
"localEchoHint": "(半双工调试)",
"errorPathRequired": "请输入串口设备路径"
},
"terminal": {
"title": "串口",
"connected": "已连接",
"disconnected": "未连接",
"connecting": "连接中…",
"error": "串口错误",
"configSummary": "{{path}} · {{baud}} · {{dataBits}}-{{parity}}-{{stopBits}}",
"opening": "正在打开 {{path}} @ {{baud}}...",
"openFailed": "打开串口失败: {{message}}",
"connectedBanner": "已连接 {{path}} · {{baud}} {{frame}} · {{lineEnding}}{{echo}}",
"localEchoSuffix": " · local echo"
}
}
+237
View File
@@ -0,0 +1,237 @@
{
"sidebar": {
"quickConnect": "快速连接",
"quickConnectShort": "快连",
"newSession": "新建会话",
"newSessionShort": "新建",
"searchPlaceholder": "搜索会话...",
"batchMode": "批量操作",
"exitBatchMode": "退出批量操作",
"batchSelected": "已选 {{count}} 个 SSH",
"batchExcludedDesktop": " · 已排除 RDP/VNC",
"selectAllVisible": "全选当前结果",
"deselectAllVisible": "取消当前结果",
"batchExec": "批量执行",
"settings": "设置",
"resizeHint": "拖拽调整宽度,双击折叠"
},
"tree": {
"selectSession": "选择会话",
"noMatchTitle": "未找到匹配的会话",
"noMatchDesc": "尝试其他关键词",
"emptyTitle": "暂无会话",
"emptyDesc": "快速连接或新建会话,双击即可进终端",
"emptyAction": "新建会话"
},
"contextMenu": {
"blank": {
"newGroup": "新建分组",
"newSession": "新建会话"
},
"group": {
"newSessionHere": "在此新建会话",
"newGroup": "新建分组",
"renameGroup": "重命名分组",
"deleteEmptyGroup": "删除空分组"
},
"session": {
"open": "打开",
"edit": "编辑",
"duplicate": "克隆",
"delete": "删除"
}
},
"groups": {
"default": "默认分组",
"new": {
"title": "新建分组",
"message": "输入分组名称",
"placeholder": "如:生产环境",
"confirm": "创建"
},
"rename": {
"title": "重命名分组",
"message": "将「{{name}}」改为",
"placeholder": "分组名称",
"confirm": "保存"
},
"deleteBlocked": {
"title": "无法删除",
"message": "分组「{{name}}」内还有会话,请先移出或删除会话。",
"confirm": "知道了"
},
"newOption": "新建分组…",
"hint": "默认「默认分组」;也可选已有分组或新建"
},
"deleteSession": {
"title": "确认删除",
"message": "确定删除会话 \"{{name}}\"?",
"confirm": "删除"
},
"welcome": {
"tagline": "远程终端 · SFTP · 端口转发",
"sectionStart": "开始",
"sectionDesktop": "远程桌面",
"sectionRecent": "最近会话",
"quickConnect": {
"title": "快速连接",
"desc": "临时 SSH,不写入会话库"
},
"newSession": {
"title": "新建会话",
"desc": "保存主机,侧栏双击连接"
},
"localShell": {
"title": "本地 Shell",
"selectShell": "选择 Shell",
"default": "默认"
},
"rdp": {
"title": "RDP 远程桌面",
"desc": "Windows · NLA / CredSSP"
},
"vnc": {
"title": "VNC 远程桌面",
"desc": "RFB · 跨平台图形会话"
},
"recentEmpty": {
"title": "暂无已保存会话",
"desc": "用快速连接试连,或新建会话以便复用"
}
},
"launcher": {
"searchPlaceholder": "搜索主机、分组或标签页"
},
"quickConnect": {
"title": "快速连接",
"target": "目标",
"targetPlaceholder": "root@192.168.1.10:22",
"targetHint": "支持 host、user@host、user@host:port",
"password": "密码",
"passwordOptional": "可选 · 用密钥可留空",
"connect": "连接",
"errorInvalidTarget": "请输入主机,例如 root@192.168.1.10 或 opsbase.cn:5555",
"errorConnectFailed": "连接失败"
},
"dialog": {
"create": "新建会话",
"edit": "编辑会话",
"subtitle": "目标一行搞定 · 高级可折叠",
"saving": "保存中…",
"save": "保存",
"createAndSave": "创建并保存",
"basic": "基本",
"login": "登录",
"advanced": "高级选项",
"advancedCollapsed": "代理 · 跳板 · 标签",
"collapse": "收起",
"protocol": "协议",
"displayName": "显示名称(可选)",
"displayNamePlaceholder": "自动用 user@host 或 vnc:host",
"host": "主机",
"hostPlaceholder": "192.168.1.10",
"hostHint": "填写 IP 或域名;也可粘贴 host:port",
"port": "端口",
"username": "用户名",
"usernamePlaceholderRdp": "Administrator",
"usernamePlaceholderSsh": "root",
"width": "宽",
"height": "高",
"group": "分组",
"authPassword": "密码",
"authKey": "密钥",
"password": "密码",
"domain": "域(可选)",
"domainPlaceholder": "不常用,企业域账号再填",
"keySource": "密钥来源",
"keyFile": "文件",
"keyText": "文本",
"privateKeyPath": "私钥路径",
"privateKeyText": "私钥内容",
"privateKeyTextHint": "粘贴的私钥会加密后落盘,与密码相同处理",
"pickKeyFile": "选择…",
"pickKeyDialogTitle": "选择私钥文件",
"allFilesFilter": "所有文件",
"passphrase": "密钥口令(可选)",
"passphrasePlaceholder": "可选",
"tags": "标签",
"tagsPlaceholder": "生产, web",
"startupCommand": "启动命令(可选)",
"startupCommandPlaceholder": "连接后自动执行,如 cd /var/log",
"proxy": "代理",
"proxyNone": "无",
"proxyHostPlaceholder": "代理地址",
"proxyPortPlaceholder": "端口",
"proxyUserPlaceholder": "用户名(可选)",
"proxyPasswordPlaceholder": "密码(可选)",
"jumpHost": "跳板机(可选)",
"jumpNone": "无跳板",
"jumpNoneAlt": "不使用跳板",
"jumpHint": "当前支持一个已保存会话作为跳板"
},
"batch": {
"title": "批量执行",
"subtitle": "已选 {{selected}} 台 · 并发 {{concurrency}} · 关闭标签即丢弃结果",
"dialogTitle": "批量命令",
"dialogDesc": "已选 {{selected}}/{{total}} 台主机 · 最大并发 {{concurrency}}",
"targetCount": "目标 {{count}} 台",
"runningProgress": "执行中 {{completed}}/{{total}}",
"execute": "执行 {{count}} 台",
"executeAgain": "再次执行",
"success": "成功 {{count}}",
"failed": "失败 {{count}}",
"command": "远程命令",
"commandPlaceholder": "例如:uptime",
"targets": "目标主机",
"filterPlaceholder": "名称、IP、分组或标签",
"filterAria": "筛选主机",
"noMatchHosts": "没有匹配的主机",
"resultMatrix": "结果矩阵",
"resultMatrixHint": "主机 × 状态 × 输出",
"emptySelection": "从左侧选择目标主机,或在侧栏批量模式保留选中后打开",
"noOutput": "(无输出)",
"errorReadConfig": "无法读取会话配置",
"errorConnectFailed": "连接失败",
"errorExecFailed": "命令执行失败",
"results": "执行结果",
"resultsHint": "输出仅保留在当前弹框内",
"ctrlEnterHint": "Ctrl/⌘ + Enter 执行",
"executeTo": "执行到 {{count}} 台",
"selectFromLeft": "请从左侧选择目标主机"
},
"importExport": {
"exportTitle": "导出会话",
"exportDefaultPath": "opsxshell-sessions.bak",
"exportFilterBak": "OpsXShell 备份",
"exportFilterJson": "JSON",
"exportSuccess": "已导出 {{count}} 个会话到:\n{{path}}",
"exportWriteFailed": "写入导出文件失败",
"exportFailed": "导出会话失败",
"exportFailedDetail": "导出会话失败:{{message}}",
"exportPasswordTitle": "设置备份密码",
"exportPasswordMessage": "导出文件将加密保存主机分组、私钥、密码等敏感信息。请设置备份密码。",
"exportPasswordPlaceholder": "输入备份密码",
"exportPasswordConfirmTitle": "确认备份密码",
"exportPasswordConfirmMessage": "请再次输入备份密码以确认。",
"exportPasswordConfirmPlaceholder": "再次输入备份密码",
"exportPasswordMismatch": "两次输入的密码不一致",
"exportPasswordRequired": "必须设置备份密码才能导出",
"importTitle": "导入会话",
"importFilterBak": "OpsXShell 备份",
"importFilterJson": "JSON",
"importFilterSshConfig": "SSH Config",
"importFilterAll": "所有文件",
"readFileFailed": "读取文件失败",
"readFileFailedDetail": "读取文件失败:{{message}}",
"importPasswordTitle": "输入备份密码",
"importPasswordMessage": "该文件已加密,请输入导出时设置的密码以导入主机分组与密钥等信息。",
"importPasswordPlaceholder": "输入备份密码",
"importPasswordRequired": "需要密码才能导入加密备份",
"importPasswordInvalid": "备份密码不正确,或文件已损坏",
"noSessionsFound": "未找到可导入的会话",
"noValidSessions": "文件中没有有效的会话配置",
"importSuccess": "成功导入 {{created}}/{{total}} 个会话",
"importFailed": "导入会话失败",
"importFailedDetail": "导入会话失败:{{message}}"
}
}
+174
View File
@@ -0,0 +1,174 @@
{
"nav": {
"general": "工作区",
"generalDesc": "布局与资源",
"appearance": "外观",
"appearanceDesc": "界面主题与语言",
"terminal": "终端",
"terminalDesc": "字体与主题色",
"shortcuts": "快捷键",
"shortcutsDesc": "键盘绑定",
"ssh": "SSH",
"sshDesc": "连接与连接池",
"security": "安全",
"securityDesc": "凭据与主机密钥",
"ai": "大模型",
"aiDesc": "AI Provider",
"about": "关于",
"aboutDesc": "版本与数据"
},
"title": "设置",
"search": {
"placeholder": "搜索设置..."
},
"language": {
"label": "界面语言",
"description": "切换后立即生效",
"zhCN": "简体中文",
"zhTW": "繁體中文",
"en": "English",
"ja": "日本語",
"ko": "한국어",
"vi": "Tiếng Việt",
"ru": "Русский"
},
"general": {
"layout": "工作区布局",
"sidebarWidth": "侧栏宽度",
"sidebarWidthDesc": "会话侧栏的默认宽度",
"collapseSidebar": "折叠侧栏",
"collapseSidebarDesc": "隐藏会话树以专心操作终端,可用 Ctrl/Cmd+B 切换"
},
"appearance": {
"themeGroup": "界面主题",
"theme": "主题",
"themeDesc": "应用界面配色(与终端配色无关)",
"dark": "深色",
"light": "浅色",
"system": "跟随系统"
},
"terminal": {
"fontGroup": "字体与字号",
"fontFamily": "字体",
"fontFamilyDesc": "需 Nerd Font 才能正确显示 Zsh 提示符图标",
"fontSize": "字号",
"fontSizeDesc": "终端文字大小",
"scrollback": "回滚缓冲",
"scrollbackDesc": "每个终端保留的历史行数",
"keywordHighlight": "关键词高亮",
"keywordHighlightDesc": "突出显示错误、警告和成功状态",
"colorTheme": "配色主题"
},
"shortcuts": {
"resetAll": "重置全部为默认",
"custom": "自定义",
"pressKeys": "按下快捷键...",
"resetDefault": "重置为默认",
"conflict": "与「{{label}}」冲突",
"setTo": "设置为 {{keys}}",
"hint": "点击快捷键可重新绑定 · 按 Esc 取消录入",
"category": {
"tabs": "标签管理",
"view": "视图",
"session": "会话",
"tools": "工具"
},
"actions": {
"tabNext": "切换到下一个标签",
"tabPrev": "切换到上一个标签",
"tabGotoN": "跳转到第 N 个标签",
"tabClose": "关闭当前标签",
"tabNew": "新建标签",
"viewFullscreen": "切换全屏",
"viewToggleSidebar": "折叠/展开侧栏",
"sessionNew": "新建会话",
"sessionQuickConnect": "快速连接",
"toolsCommandPalette": "命令面板"
}
},
"ssh": {
"connection": "连接",
"keepAlive": "保持心跳",
"keepAliveDesc": "空闲时发送心跳,减少断线",
"autoReconnect": "自动重连",
"autoReconnectDesc": "意外断开后自动尝试重连",
"timeout": "连接超时",
"timeoutDesc": "建立 SSH 连接的最长等待时间(秒)",
"maxReconnect": "自动重连次数",
"maxReconnectDesc": "意外断线后的最大尝试次数",
"pool": "连接池",
"maxConnections": "最大连接数",
"maxConnectionsDesc": "SSH、SFTP 与批量连接共享此上限",
"maxBackground": "后台连接上限",
"maxBackgroundDesc": "超过上限时优先回收最久未使用的连接",
"suspend": "后台挂起",
"suspendDesc": "标签进入后台后多少分钟释放活跃通道"
},
"security": {
"credentials": "凭据保护",
"sessionPassword": "会话密码与密钥口令",
"sessionPasswordDesc": "保存前由 Rust 使用 AES-256-GCM 加密,无法关闭",
"enabled": "已启用",
"masterKey": "本地主密钥",
"masterKeyDesc": "仅当前系统用户可读取;路径 ~/.opsxshell/master.key(旧版 ~/.opsxshsell 会自动迁移)",
"knownHosts": "已知主机",
"knownHostsHint": "首次连接会确认主机指纹。重装/克隆导致密钥变更时,连接弹窗可选「仍要信任并更新」覆盖旧记录。此处可删除单条或清空全部。",
"clearAll": "清空",
"removeHost": "删除此主机记录",
"empty": "暂无记录",
"clearConfirm": "确定清空全部已知主机密钥?下次连接将重新确认。"
},
"about": {
"tagline": "轻量原生的 SSH / SFTP 运维终端",
"appVersion": "应用 v{{version}}",
"copyVersion": "复制版本信息",
"runtime": "运行环境",
"system": "系统",
"localData": "本地数据",
"sessionsSettings": "会话与设置",
"masterKeyPath": "加密主密钥",
"privacyNote": "密码与密钥口令由 Rust 使用 AES-256-GCM 加密。OpsXShell 不保存终端命令历史。",
"license": "MIT License · Rust · XTerm.js"
},
"ai": {
"presets": "供应商预设",
"add": "添加",
"configured": "已配置",
"configuredHint": "选择供应商后点添加",
"emptyHint": "添加一个 Provider 开始",
"noModel": "未选模型",
"name": "名称",
"model": "模型",
"protocol": "协议",
"auth": "认证",
"authNone": "无",
"test": "测试",
"testing": "测试中",
"testingMessage": "测试中...",
"saved": "已保存",
"retest": "请重新测试",
"testFailed": "连接测试失败",
"available": "可用 · {{latency}} ms",
"savedKeepBlank": "已保存,留空沿用",
"notRequired": "无需填写",
"otherModels": "其他模型…",
"customModel": "自定义模型",
"backToList": "返回列表",
"apiKeyOptional": "API Key(无需)",
"advanced": "高级",
"allowHttp": "允许 HTTP(本机/内网)",
"setActive": "设为当前",
"deleteTitle": "删除",
"apiKeySaveFailed": "API Key 保存失败",
"providerNotFound": "Provider 不存在",
"modelCatalogReadFailed": "模型目录读取失败",
"catalogUnavailable": "models.dev 暂不可用"
},
"family": {
"openai_compatible": "OpenAI 兼容",
"standalone": "────────",
"plan": "Plan 计划",
"local": "私有化本地",
"custom": "Custom 自定义"
}
}
+186
View File
@@ -0,0 +1,186 @@
{
"panel": {
"local": "本地",
"remote": "远程",
"notConnectedTitle": "未连接到远程服务器",
"notConnectedDesc": "请先连接 SSH 会话以使用 SFTP",
"ariaLabel": "{{title}}文件面板"
},
"connection": {
"selectServer": "选择服务器",
"noSessions": "暂无保存的会话",
"createSessionHint": "请先在侧边栏创建会话",
"reconnect": "重新连接",
"notConnected": "未连接",
"connecting": "连接中..."
},
"errors": {
"notConnected": "SFTP 尚未连接",
"noUploadFiles": "没有可上传的文件",
"localStatFailed": "无法读取本地文件信息",
"loadRemoteFailed": "加载远程目录失败: {{message}}",
"noFolderDownload": "下载文件夹失败",
"selectDownloadFiles": "请先选择要下载的文件",
"uploadFailed": "上传失败",
"downloadFailed": "下载失败",
"fileError": "{{fileName}}: {{message}}"
},
"toolbar": {
"upload": "上传",
"uploadAria": "上传",
"download": "下载",
"downloadAria": "下载",
"downloadNeedSelection": "请先选择远程文件",
"downloadHint": "下载选中的远程文件",
"refresh": "刷新",
"refreshAria": "刷新",
"newFolder": "新建文件夹",
"newFolderAria": "新建文件夹"
},
"sort": {
"name": "名称",
"modified": "修改时间",
"size": "大小",
"type": "类型"
},
"nav": {
"home": "主目录",
"back": "后退",
"forward": "前进",
"up": "上级目录",
"searchPlaceholder": "搜索文件名",
"clearSearch": "清除搜索",
"clearSearchAria": "清除搜索",
"showHidden": "显示隐藏文件",
"hideHidden": "隐藏点文件(.xxx)",
"showHiddenAria": "显示隐藏文件",
"hideHiddenAria": "隐藏点文件",
"searchAria": "{{title}} 当前文件夹搜索"
},
"status": {
"loading": "加载中...",
"selected": "已选择 {{count}} 项",
"filtered": "显示 {{shown}} / {{total}} 项",
"hiddenCount": "共 {{total}} 项(已隐藏 {{hidden}})",
"total": "共 {{count}} 项",
"filterHint": "筛选: {{query}}"
},
"empty": {
"dirTitle": "目录为空",
"dirDescLocal": "此目录下没有文件",
"dirDescRemote": "可尝试返回上级或刷新",
"goUp": "返回上级",
"hiddenOnlyTitle": "仅有隐藏文件",
"hiddenOnlyDesc": "点击标题栏眼睛图标显示点文件",
"showHiddenAction": "显示隐藏文件",
"noMatchTitle": "无匹配文件",
"noMatchDesc": "没有包含「{{query}}」的文件"
},
"fileType": {
"folder": "文件夹",
"symlink": "链接",
"symlinkLong": "符号链接",
"file": "文件",
"text": "文本",
"log": "日志",
"database": "数据库",
"imageIso": "镜像",
"executable": "可执行",
"library": "库"
},
"relativeDate": {
"today": "今天",
"yesterday": "昨天",
"daysAgo": "{{count}} 天前"
},
"contextMenu": {
"open": "打开",
"upload": "上传",
"download": "下载",
"edit": "编辑",
"rename": "重命名",
"copyPath": "复制路径",
"properties": "属性",
"permissions": "权限",
"delete": "删除"
},
"dialog": {
"renameTitle": "重命名",
"renameMessage": "输入新名称:",
"renamePlaceholder": "新名称",
"newFolderTitle": "新建文件夹",
"newFolderMessage": "输入文件夹名称:",
"newFolderPlaceholder": "文件夹名称",
"propertiesTitle": "文件属性",
"propertiesClose": "关闭",
"chmodTitle": "权限编辑",
"chmodApply": "应用",
"pickUploadTitle": "选择要上传的文件或文件夹",
"pickUploadRzTitle": "选择要上传的文件(rz)"
},
"properties": {
"name": "名称",
"path": "路径",
"size": "大小",
"permissions": "权限",
"modified": "修改时间",
"accessed": "访问时间",
"symlink": "符号链接",
"loadingDetails": "加载详细信息..."
},
"chmod": {
"read": "读取",
"write": "写入",
"execute": "执行",
"owner": "所有者",
"group": "所属组",
"other": "其他人",
"current": "当前权限:",
"readR": "读取 (r)",
"writeW": "写入 (w)",
"executeX": "执行 (x)"
},
"transfer": {
"queue": "传输队列",
"active": "{{count}} 进行中",
"completed": "{{count}} 已完成",
"taskCount": "{{count}} 个任务",
"empty": "暂无传输任务",
"cancel": "取消",
"remove": "移除",
"statusWaiting": "等待中",
"statusDone": "完成",
"statusFailed": "失败",
"statusCancelled": "已取消",
"dropUpload": "上传到 {{path}}",
"dropDownload": "下载到 {{path}}"
},
"editor": {
"readFailed": "读取失败",
"saveFailed": "保存失败",
"unsavedClose": "有未保存的修改,确定关闭?",
"saving": "保存中...",
"save": "保存",
"saved": "文件已保存",
"loadingEditor": "加载编辑器...",
"footer": "UTF-8 · Monaco · ⌘/Ctrl+S 保存 · 最大约 2MB",
"charCount": "{{count}} 字符",
"unsavedMark": " · 未保存",
"savedMark": " · 已保存"
},
"toast": {
"renamed": "已重命名为 {{name}}",
"renameFailed": "重命名失败",
"pathCopied": "路径已复制到剪贴板",
"pathCopyFailed": "复制路径失败",
"chmodUpdated": "权限已更新为 {{mode}}",
"chmodFailed": "权限修改失败",
"uploadPartial": "{{action}}完成 {{completed}} 个,失败 {{failed}} 个:{{detail}}",
"uploadSuccess": "{{action}}完成 {{completed}} 项",
"uploadAction": "上传",
"downloadAction": "下载",
"noFolderUpload": "上传文件夹失败",
"noDragPath": "当前系统未提供拖拽文件路径,请使用“上传”按钮选择文件",
"noFolderRecursive": "文件夹递归传输失败,请重试或改用上传按钮"
}
}
+32
View File
@@ -0,0 +1,32 @@
{
"panel": {
"title": "命令片段"
},
"search": {
"placeholder": "搜索片段..."
},
"form": {
"name": "名称",
"command": "命令",
"tags": "标签",
"tagsHint": "(逗号分隔)",
"namePlaceholder": "例如:重启 Nginx",
"commandPlaceholder": "sudo systemctl restart nginx\n# 支持 {{host}} {{username}} {{date}}",
"variables": "变量:"
},
"dialog": {
"createTitle": "新建片段",
"editTitle": "编辑片段"
},
"empty": {
"noMatch": "没有匹配的片段",
"noMatchDesc": "尝试其他关键词搜索",
"noSnippets": "暂无片段",
"noSnippetsDesc": "保存常用命令,快速插入到终端"
},
"action": {
"create": "新建片段",
"insert": "插入到终端",
"noTerminal": "无活跃终端"
}
}
+119
View File
@@ -0,0 +1,119 @@
{
"toolbar": {
"splitHorizontal": "左右分屏",
"splitVertical": "上下分屏",
"addPane": "再加一屏",
"closePane": "关闭当前分屏",
"maximizePane": "最大化当前分屏",
"restoreLayout": "恢复分屏布局",
"broadcast": "广播",
"broadcastAria": "广播输入",
"broadcastOn": "广播已开启:输入将同步到范围内 {{count}} 个终端",
"broadcastOffPro": "广播同步输入(Pro)· 当前范围 {{count}} 个终端",
"broadcastNeedPanesTab": "当前标签至少需要 2 个就绪分页才能广播(先点上下/左右分屏)",
"broadcastNeedPanesAll": "全部终端标签至少需要 2 个就绪终端才能广播",
"broadcastScopeAria": "广播目标范围",
"broadcastScopeTab": "当前标签分页",
"broadcastScopeAll": "全部终端标签",
"broadcastActive": "广播中 · {{count}}",
"aiAssistant": "AI 助手",
"aiOpen": "打开终端 AI 助手",
"aiClose": "关闭终端 AI 助手",
"aiTitle": "终端 AI 助手(Pro)",
"paneCount": "{{current}}/{{max}}",
"labelLocal": "本地终端",
"labelSsh": "SSH 终端",
"closePaneLabel": "关闭当前分屏",
"closeTabLabel": "关闭当前终端标签",
"targetSshSession": "当前 SSH 会话"
},
"overlay": {
"shellClosedIdle": "空闲超时,Shell 已退出",
"shellClosed": "Shell 已退出",
"shellClosedHint": "SSH 连接仍可用,其他分屏、SFTP 和隧道不受影响",
"reopenShell": "重新打开 Shell",
"reopening": "正在打开…",
"disconnected": "连接已断开",
"disconnectedHint": "SSH 会话已结束或网络中断。点击下方一键重新连接。",
"reconnect": "重新连接",
"suspended": "连接已挂起",
"suspendedHint": "长时间未操作,连接已进入挂起以节省资源",
"resume": "恢复连接",
"connectFailed": "连接失败",
"connectFailedHint": "请检查主机、端口、用户名与认证方式",
"retryConnect": "重试连接",
"connecting": "正在连接…",
"reconnecting": "自动重连中{{attempt}}…",
"reconnectingAttempt": " ({{count}})",
"localShellExited": "本地 Shell 已退出"
},
"hostKey": {
"titleNew": "确认主机密钥",
"titleChanged": "主机密钥已变更",
"descNew": "首次连接此主机,请核对指纹后信任。",
"descChanged": "该主机的 SSH 密钥与本地记录不一致,可能存在中间人攻击风险。",
"host": "主机",
"type": "类型",
"fingerprint": "SHA256 指纹",
"previousFingerprint": "先前指纹",
"reject": "拒绝",
"acceptOnce": "仅本次",
"acceptAlways": "始终信任",
"acceptAlwaysChanged": "仍要信任并更新"
},
"contextMenu": {
"aria": "终端操作",
"copy": "复制",
"paste": "粘贴",
"selectAll": "全选终端内容",
"clear": "清空显示",
"splitRight": "向右分屏",
"splitDown": "向下分屏",
"maximizePane": "最大化当前分屏",
"restoreLayout": "恢复分屏布局"
},
"search": {
"placeholder": "搜索...",
"previous": "上一个 (Shift+Enter)",
"next": "下一个 (Enter)",
"close": "关闭 (Escape)"
},
"zmodem": {
"uploadTransferring": "rz 上传:{{detail}}",
"downloadTransferring": "sz 下载:{{detail}}",
"selectLocalFile": "选择本地文件",
"pickUploadTitle": "选择要上传的文件(rz)",
"uploadedCount": "已上传 {{count}} 个文件",
"downloadedSingle": "{{path}}",
"downloadedCount": "已下载 {{count}} 个文件 → {{dir}}",
"transferDone": "传输结束",
"transferFailed": "传输失败 {{message}}",
"uploadSuccessTerminal": "✓ 已上传 {{count}} 个文件 到远端当前目录",
"downloadSuccessTerminal": "✓ 已下载 {{path}}",
"savedDownloadsSingle": "✓ 已保存到下载目录",
"savedDownloadsMultiple": "✓ 已保存 {{count}} 个文件到下载目录",
"nativeApiUnavailable": "原生 API 不可用",
"readFailed": "读取失败: {{name}}",
"writeFailed": "写入失败: {{name}}",
"createLocalShellFailed": "创建本地 Shell 失败",
"createRemoteShellFailed": "创建远端 Shell 失败",
"createShellFailed": "创建 Shell 失败: {{error}}"
},
"clipboard": {
"readFailed": "读取剪贴板失败",
"writeFailed": "写入剪贴板失败"
},
"input": {
"failed": "终端输入失败"
},
"connection": {
"errorPrefix": "错误: {{message}}",
"autoReconnecting": "自动重连中 ({{attempt}})...",
"autoReconnectLimit": "自动重连已达上限 ({{max}}){{reasonSuffix}}",
"autoReconnectLimitReason": " — {{reason}}",
"disconnectedRetry": "连接断开,{{seconds}}s 后第 {{attempt}}/{{max}} 次重连...",
"autoReconnectBanner": "[自动重连] {{seconds}}s 后尝试 {{attempt}}/{{max}}",
"disconnectedBanner": "[连接已断开] {{reason}}",
"noConfig": "无可用连接信息"
}
}