feat: harden local shell, SFTP, and desktop session reliability

Finder-launched terminals now inherit a login PATH so tools like ollama resolve, destructive SFTP/editor actions require confirmation, and terminal search plus window dragging work again. SSH forwards and RDP sessions keep listeners and survive reconnect without FastPath crashes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Logan.LiandCursor committed 2026-08-16 16:08:11 +08:00
1 parent 188f3556ed
commit 08696896f9
223 files changed
+13493 -3423

No files matched your search

+114 -39
View File
@@ -78,7 +78,7 @@
"closeTab": "關閉目前分頁",
"closeAllTabs": "關閉所有分頁",
"portForward": "新增埠轉發",
"upgradePro": "升級 OpsXShell Pro",
"upgradePro": "升級 OpsXShell 專業版",
"editSession": "編輯連線: {{name}}"
}
},
@@ -90,6 +90,8 @@
"terminal": "終端機",
"batch": "批次執行",
"newTerminal": "新終端機",
"closeAria": "關閉 {{title}}",
"listAria": "已開啟的標籤",
"kind": {
"terminal": "終端機",
"sftp": "SFTP",
@@ -105,7 +107,8 @@
"closeRight": "關閉右側分頁",
"closeLeft": "關閉左側分頁",
"closeAll": "關閉全部",
"clone": "克隆分頁"
"clone": "克隆分頁",
"openSftp": "開啟 SFTP"
}
},
"sidebar": {
@@ -149,39 +152,44 @@
"disconnect": "中斷"
},
"pro": {
"upgrade": "升級 Pro",
"feature": "專業功能",
"unlock": "解鎖 {{feature}}",
"upgrade": "升級專業版",
"feature": "專業版功能",
"unlock": "解鎖專業版進階功能",
"comingSoon": "即將推出",
"activateSuccess": "啟用成功",
"activateFailed": "啟用失敗",
"licenseActivated": "Pro 授權已啟用",
"licenseActivated": "專業版授權已啟用",
"paymentPending": "付款完成後請貼上授權,或稍後再試啟用",
"invalidLicense": "啟用失敗:授權無效",
"goUpgrade": "前往付費升級",
"goUpgrade": "去升級專業版",
"haveLicense": "已有授權?啟用",
"title": "OpsXShell Pro · 解鎖專業維運能力",
"subtitleComingSoon": "{{feature}} 即將推出 · 升級 Pro 可優先體驗",
"subtitleUnlock": "正在解鎖:{{feature}}",
"subtitleDefault": "轉發、代理、序列埠、AI、批次與廣播",
"activated": "已啟用 Pro",
"title": "OpsXShell · 解鎖專業版",
"subtitleComingSoon": "進階功能即將推出 · 升級專業版可優先體驗",
"subtitleUnlock": "目前正在解鎖進階功能",
"subtitleDefault": "連接埠轉發、終端 AI、批次運維、主機清單與遠端桌面等專業版能力",
"activated": "已啟用專業版",
"expiresAt": " · 有效期至 {{date}}",
"lifetime": " · 終身授權",
"oneTimeFee": "一次性費用 · 本機終身授權 · 無需訂閱",
"oneTimeFee": "免費 / 專業版年繳 / 專業版永久",
"pasteLicense": "貼上授權",
"activateButton": "啟用",
"clearLicense": "清除本機授權",
"paymentNote": "付款由 Waffo 託管收銀台處理;本應用不收集或儲存信用卡資料。",
"testDeviceId": "測試環境 · 裝置 ID:{{deviceId}}",
"later": "稍後再說",
"viewPro": "檢視 Pro",
"wallComingSoonSuffix": " · 即將推出",
"wallUnlock": "解鎖 {{feature}}",
"wallMessageComingSoon": "此能力屬於 OpsXShell Pro,協定實現尚在開發中。升級後可優先體驗。",
"wallMessageDefault": "此功能屬於 OpsXShell Pro。升級後即可在本機使用。",
"viewPro": "查看專業版方案",
"wallComingSoonSuffix": "即將推出",
"wallUnlock": "解鎖專業版進階功能",
"wallMessageComingSoon": "此能力屬於 OpsXShell 專業版,相關實作尚在完善。升級專業版年繳或永久後,可優先體驗。",
"wallMessageDefault": "連接埠轉發、終端 AI、批次執行、主機清單與遠端桌面等均包含在專業版中。升級專業版年繳或永久後,即可在本機使用。",
"checkoutUnavailable": "結帳服務無法使用 ({{status}})",
"freeTier": "Free",
"proTier": "Pro",
"emailLabel": "電子郵件",
"emailRequired": "結帳前請先填寫電子郵件",
"claimPending": "正在領取授權…",
"invalidKeyFormat": "金鑰格式無效,請貼上 LIC- 開頭的授權碼",
"accountEmail": "帳戶:{{email}}",
"freeTier": "免費",
"proTier": "專業版",
"freeItems": {
"ssh": "SSH 終端機",
"sftp": "SFTP 檔案管理",
@@ -190,19 +198,40 @@
"import": "單筆 / ssh_config 匯入"
},
"proItems": {
"forward": "埠轉發",
"proxy": "連線代理 / SOCKS",
"serial": "序列埠終端機",
"ai": "終端機 AI 助手",
"forward": "連接埠轉發",
"proxy": "工作階段代理 / SOCKS",
"serial": "序列埠終端",
"ai": "終端 AI 助手",
"batch": "批次執行 / 廣播同步",
"broadcast": "廣播同步輸入",
"importExport": "批次匯入匯出主機清單",
"desktop": "RDP / VNC 遠端桌面"
}
"desktop": "遠端桌面(RDP / VNC)"
},
"planYearly": "專業版年繳",
"planYearlyDesc": "¥99 / 年 · 2 台裝置",
"planPerpetual": "專業版永久",
"planPerpetualDesc": "¥199 · 5 台裝置 · 終身",
"planTrial": "專業版體驗",
"devices": "最多 {{count}} 台裝置",
"goUpgradeYearly": "購買專業版年繳",
"goUpgradePerpetual": "購買專業版永久",
"activatedYearly": "已啟用專業版年繳",
"activatedPerpetual": "已啟用專業版永久",
"activatedTrial": "已啟用專業版體驗",
"choosePlan": "選擇方案:免費 / 專業版年繳 / 專業版永久",
"planFreePrice": "¥0",
"planFreeDesc": "SSH · SFTP · 本機終端",
"planFreeCta": "目前方案",
"planIncludesPro": "含全部專業版功能",
"planFree": "免費",
"subtitleUnlockDetail": "相關能力:{{feature}}",
"wallUnlockComingSoon": "專業版進階功能即將推出",
"wallMessageComingSoonFeature": "「{{feature}}」屬於專業版進階功能,相關實作尚在完善。升級專業版年繳或永久後,可優先體驗。",
"wallMessageFeature": "「{{feature}}」屬於專業版進階功能。升級專業版年繳或永久後,即可在本機使用。"
},
"launcher": {
"title": "快速啟動",
"description": "連線、本機 Shell 與裝置控制台統一入口",
"description": "常用入口集中:工作階段、本機 Shell、桌面、串列埠",
"cards": {
"quickConnect": {
"title": "快速連線",
@@ -215,6 +244,14 @@
"serial": {
"title": "序列埠終端機",
"desc": "鮑率與序列埠參數"
},
"rdp": {
"title": "RDP 桌面",
"desc": "遠端 Windows 桌面"
},
"vnc": {
"title": "VNC 桌面",
"desc": "遠端圖形桌面"
}
},
"sectionLocalShell": "本機 Shell",
@@ -229,6 +266,7 @@
"forwardOpenRunning": "SOCKS5 已開(:{{port}})· 點擊管理 · 右鍵複製",
"forwardStarted": "轉發已啟動",
"forwardStartedDynamic": "SOCKS5 已啟動:socks5://127.0.0.1:{{port}}",
"forwardResumed": "已恢復 {{count}} 條連接埠轉發",
"socksStartFailed": "啟動失敗:{{message}}",
"socksStopFailed": "停止失敗:{{message}}",
"socksCopied": "已複製 socks5://127.0.0.1:{{port}}"
@@ -249,7 +287,7 @@
"typeDynamic": "動態",
"running": "執行中",
"socksProxy": "SOCKS5:127.0.0.1:{{port}}",
"remoteToLocal": "遠端 {{remote}} → 本機 {{local}}",
"remoteToLocal": "遠端 {{bind}}:{{remote}} → {{host}}:{{local}}",
"stats": "{{connections}} 連線 · ↑{{up}} · ↓{{down}}",
"copyProxy": "複製代理",
"copyRule": "複製規則",
@@ -259,15 +297,15 @@
"delete": "刪除",
"editTitle": "編輯轉發",
"addTitle": "新增轉發",
"typeLocalDesc": "本機 → 遠端",
"typeRemoteDesc": "遠端 → 本機",
"typeLocalDesc": "存取遠端服務",
"typeRemoteDesc": "暴露本機服務",
"typeDynamicDesc": "SOCKS5",
"selectType": "轉發類型",
"drawerSubtitle": "經目前 SSH 建立通道",
"ruleFields": "參數",
"dynamicHint": "本機 SOCKS5:127.0.0.1:1080。流量經目前 SSH 伺服器出口 IP 存取外部網路。",
"dynamicSingleHint": "每台 SSH 僅一條動態轉發,連接埠固定 1080。",
"dynamicPortHint": "If the port is busy, pick another local port (e.g. 1081).",
"dynamicHint": "本機 SOCKS5(預設 :1080)。流量經目前 SSH 出口存取外網。",
"dynamicSingleHint": "每台 SSH 僅一條動態轉發;停止後可改連接埠。",
"dynamicPortHint": "連接埠被占用時可改,例如 1081。",
"ruleList": "規則",
"ruleListEmpty": "暫無本地 / 遠端規則",
"addSection": "新增",
@@ -301,17 +339,30 @@
"internet": "網際網路",
"localCaption": "本地轉發:經通道存取遠端連接埠,如同存取本機。",
"remoteCaption": "遠端轉發:遠端存取經通道轉到本機服務。",
"dynamicCaption": "動態轉發:本機變成 SOCKS5 代理,可經目前 SSH 伺服器出口 IP 存取網際網路。"
"dynamicCaption": "動態轉發:本機 SOCKS5,經目前 SSH 出口存取外網。"
},
"ruleName": "名稱",
"ruleNamePlaceholder": "例如 MySQL",
"localListenPort": "本機監聽連接埠",
"localListenPortHint": "預設 localhost,等同 ssh -L 連接埠:…。一般只填連接埠。",
"localBindAdvanced": "進階:改本機綁定",
"localTargetPort": "本機目標連接埠",
"remoteTargetPort": "遠端目標連接埠",
"remoteTargetPort": "目標埠",
"remoteListenPort": "遠端監聽連接埠",
"remoteListenPortHint": "預設僅遠端 localhost,等同 ssh -R 連接埠:…。一般只填連接埠。",
"remoteListenAddress": "遠端監聽",
"remoteListenAddressPlaceholder": "127.0.0.1:18080",
"remoteListenAddressHint": "127.0.0.1 = 僅遠端本機;0.0.0.0 = 遠端內網可連(需 GatewayPorts)。",
"errorRemoteListenAddress": "請填寫有效遠端監聽,如 127.0.0.1:18080",
"localTargetAddress": "本機 / 內網目標",
"localTargetAddressPlaceholder": "127.0.0.1:8080",
"localTargetAddressHint": "轉到本機或內網服務,如 127.0.0.1:8080。勿填 0.0.0.0。",
"viaSessionRemote": "在 {{target}} 上監聽(預設 localhost)",
"errorRemoteListenPort": "請填寫有效的遠端監聽連接埠(1–65535)",
"errorLocalTargetAddress": "請填寫有效本機/內網目標,如 127.0.0.1:8080",
"portPlaceholder": "如 3306",
"remoteHost": "遠端主機",
"remoteHostPlaceholder": "localhost 或 IP",
"remoteHost": "目標主機",
"remoteHostPlaceholder": "127.0.0.1",
"socksRuleName": "SOCKS5 代理",
"defaultLocalName": "本地轉發",
"defaultRemoteName": "遠端轉發",
@@ -325,11 +376,35 @@
"deleteConfirm": "確定刪除此規則?",
"errorNamePort": "請填寫名稱和有效連接埠(1–65535)",
"errorTargetPort": "請填寫有效目標連接埠(1–65535)",
"errorRemoteHost": "請填寫遠端主機",
"errorRemoteHost": "請填寫目標主機(相對目前 SSH 伺服器)",
"errorNotConnected": "未連線到伺服器",
"errorStartFailed": "啟動失敗",
"errorStopFailed": "停止失敗",
"errorSocksRunning": "SOCKS5 已在執行",
"copySuffix": "副本"
"copySuffix": "副本",
"remoteBindHint": "0.0.0.0 需 GatewayPorts;未開啟時常靜默繫 127.0.0.1。目標勿填 0.0.0.0。",
"localToRemote": "本機 {{bind}}:{{local}} → 遠端 {{host}}:{{remote}}",
"localToRemotePort": "本機 :{{local}} → 遠端 {{host}}:{{remote}}",
"remoteHostHint": "相對 SSH 伺服器。遠端本機填 127.0.0.1,內網其它機填可達 IP。勿填 0.0.0.0。",
"localBindHost": "本機綁定",
"localBindHostPlaceholder": "127.0.0.1",
"localBindHostHint": "預設僅本機。填 0.0.0.0 或內網 IP 可讓區網存取。",
"errorTargetHostInvalid": "目標不能是 0.0.0.0,請填 127.0.0.1 或可達內網 IP",
"listenAddress": "本機監聽",
"listenAddressPlaceholder": "127.0.0.1:8080",
"listenAddressHint": "預設僅本機;0.0.0.0 可讓區網存取。",
"targetAddress": "遠端目標",
"targetAddressPlaceholder": "127.0.0.1:80",
"targetAddressHint": "相對 SSH 伺服器。遠端本機服務填 127.0.0.1:連接埠。",
"errorListenAddress": "請填寫有效監聽位址,如 127.0.0.1:8080",
"errorTargetAddress": "請填寫有效目標,如 127.0.0.1:80",
"targetAddressHintVia": "經 {{target}}。遠端本機服務填 127.0.0.1:連接埠(不會在遠端新建連接埠)。",
"viaSession": "經目前工作階段 {{target}}",
"remoteToLocalPort": "遠端 :{{remote}} → {{host}}:{{local}}",
"remoteBindAdvanced": "進階:改遠端繫結",
"remoteBindHost": "遠端繫結",
"remoteBindHostPlaceholder": "127.0.0.1",
"remoteBindHostHint": "預設僅遠端本機。0.0.0.0 需 GatewayPorts;未開啟時多數 sshd 仍只繫 127.0.0.1。",
"remoteGatewayPortsWarning": "已請求遠端 0.0.0.0 監聽。若未開 GatewayPorts,sshd 常會靜默只繫 127.0.0.1。"
}
}
+11 -4
View File
@@ -15,10 +15,12 @@
"passwordOptional": "密碼(可選)",
"width": "寬度",
"height": "高度",
"rdpFootnote": "原生 IronRDP:TCP → X.224 → TLS → CredSSP/NLA → MCS;握手逾時 45s。憑證校驗目前為開發期寬鬆模式。",
"vncFootnote": "原生 vnc-rs RFB:支援 Tight JPEG 畫面解碼;剪貼簿按 UTF-8 傳送(極舊服務端可能亂碼)。",
"rdpFootnote": "全螢幕或最大化時,會依目前視窗區域動態請求遠端解析度;也可在連線前用預設選擇初始解析度。憑證驗證目前為開發期寬鬆模式。",
"vncFootnote": "多數 VNC 伺服器解析度由遠端固定,全螢幕僅本機縮放適配;連線前的偏好尺寸僅供參考。剪貼簿以 UTF-8 傳送。",
"errorHostRequired": "請輸入主機位址",
"errorUsernameRequired": "請輸入使用者名稱"
"errorUsernameRequired": "請輸入使用者名稱",
"resolution": "解析度",
"resolutionCustom": "自訂"
},
"toolbar": {
"pasteClipboard": "貼上本機剪貼簿到遠端",
@@ -28,7 +30,12 @@
"openShareDir": "在本機開啟共享目錄(下載資料夾)",
"openShareDirAria": "開啟共享目錄",
"disconnect": "中斷連線",
"disconnectAria": "中斷連線"
"disconnectAria": "中斷連線",
"fullscreen": "全螢幕",
"fullscreenAria": "進入全螢幕",
"exitFullscreen": "結束全螢幕",
"exitFullscreenAria": "結束全螢幕",
"exitFullscreenHint": "Esc / F11 結束"
},
"status": {
"connecting": "正在連線…",
+16 -3
View File
@@ -39,7 +39,9 @@
"closed": "連線已關閉",
"dnsFailed": "無法解析主機",
"refused": "連線被拒絕",
"disconnected": "連線已中斷"
"disconnected": "連線已中斷",
"keepaliveFailed": "SSH 心跳連續失敗,連線已關閉",
"idleKicked": "遠端 Shell 因閒置逾時退出(TMOUT)"
},
"auth": {
"failed": "認證失敗,請檢查使用者名稱和密碼",
@@ -68,7 +70,10 @@
"forward": {
"failed": "埠轉發設定失敗",
"bindFailed": "連接埠綁定失敗",
"alreadyInUse": "連接埠已被佔用"
"alreadyInUse": "本機埠已被占用。請先暫停本規則或其他占用該埠的行程,再啟動。",
"remoteDenied": "遠端拒絕遠端埠轉發(AllowTcpForwarding / PermitListen、埠占用或綁定限制)。目前僅在遠端 127.0.0.1 監聽。",
"remoteDeniedPrivileged": "遠端拒絕特權監聽埠(<1024)。請改用 ≥1024,或以 root 監聽,並檢查 AllowTcpForwarding / PermitListen。",
"invalidTargetHost": "目標位址不能是 0.0.0.0,請填 127.0.0.1 或遠端可達的內網 IP"
},
"sftp": {
"connectFailed": "SFTP 連線失敗",
@@ -80,7 +85,15 @@
"writeFailed": "儲存失敗",
"renameFailed": "重新命名失敗",
"chmodFailed": "權限修改失敗",
"apiUnavailable": "SFTP API 無法使用"
"apiUnavailable": "SFTP API 無法使用",
"channelFailed": "無法開啟 SFTP 通道(伺服器限制或工作階段忙碌),請重連後再試",
"sessionGone": "SFTP 工作階段已結束,請重新連線",
"busy": "正在傳輸檔案,請稍後再試",
"editTooLarge": "檔案過大,文字編輯上限約 2MB。請下載後用本機編輯器開啟。",
"editBinary": "此檔案像是二進位內容,無法用文字編輯器開啟",
"editNotUtf8": "遠端檔案不是有效 UTF-8 文字",
"transferCancelled": "傳輸已取消",
"diskFull": "磁碟空間不足(本機或遠端)"
},
"session": {
"notFound": "連線不存在",
+6 -4
View File
@@ -69,17 +69,17 @@
"confirm": "刪除"
},
"welcome": {
"tagline": "遠端終端機 · SFTP · 埠轉發",
"tagline": "簡單好用 · 終端機 · 傳檔 · 遠端桌面",
"sectionStart": "開始",
"sectionDesktop": "遠端桌面",
"sectionRecent": "最近連線",
"quickConnect": {
"title": "快速連線",
"desc": "臨時 SSH,不寫入連線庫"
"desc": "臨時 SSH,不寫入工作階段庫"
},
"newSession": {
"title": "新增連線",
"desc": "儲存主機,側欄雙擊連線"
"desc": "儲存主機,側欄雙擊即連"
},
"localShell": {
"title": "本機 Shell",
@@ -167,7 +167,9 @@
"jumpHost": "跳板機(可選)",
"jumpNone": "無跳板",
"jumpNoneAlt": "不使用跳板",
"jumpHint": "目前支援一個已儲存連線作為跳板"
"jumpHint": "目前支援一個已儲存連線作為跳板",
"resolution": "解析度",
"resolutionCustom": "自訂"
},
"batch": {
"title": "批次執行",
+51 -19
View File
@@ -1,9 +1,7 @@
{
"nav": {
"general": "工作區",
"generalDesc": "版面與資源",
"appearance": "外觀",
"appearanceDesc": "介面主題與語言",
"general": "一般",
"generalDesc": "主題、語言與版面",
"terminal": "終端機",
"terminalDesc": "字型與配色",
"shortcuts": "快捷鍵",
@@ -15,11 +13,13 @@
"ai": "大模型",
"aiDesc": "AI Provider",
"about": "關於",
"aboutDesc": "版本與資料"
"aboutDesc": "版本與資料",
"account": "帳戶",
"accountDesc": "電子郵件、授權與裝置"
},
"title": "設定",
"search": {
"placeholder": "搜尋設定..."
"placeholder": "搜尋設定…"
},
"language": {
"label": "介面語言",
@@ -89,7 +89,7 @@
"ssh": {
"connection": "連線",
"keepAlive": "保持心跳",
"keepAliveDesc": "閒置時發送心跳,減少斷線",
"keepAliveDesc": "閒置時發送 SSH 心跳;連續多次無回應才會斷線",
"autoReconnect": "自動重連",
"autoReconnectDesc": "意外斷線後自動嘗試重連",
"timeout": "連線逾時",
@@ -101,8 +101,10 @@
"maxConnectionsDesc": "SSH、SFTP 與批次連線共享此上限",
"maxBackground": "背景連線上限",
"maxBackgroundDesc": "超過上限時優先回收最久未使用的連線",
"suspend": "背景暫停",
"suspendDesc": "分頁進入背景後多少分鐘釋放活躍通道"
"suspend": "背景掛起",
"suspendDesc": "背景標籤閒置多少分鐘後掛起(有活躍 Shell/SFTP 時保持連線)",
"keepAliveInterval": "心跳間隔(秒)",
"keepAliveIntervalDesc": "向伺服器發送心跳的頻率(類似 ClientAliveInterval)。不穩定網路建議 ≤15 秒"
},
"security": {
"credentials": "憑證保護",
@@ -119,7 +121,7 @@
"clearConfirm": "確定清空全部已知主機金鑰?下次連線將重新確認。"
},
"about": {
"tagline": "輕量原生的 SSH / SFTP 維運終端機",
"tagline": "簡單、便捷、人性化的原生維運終端",
"appVersion": "應用 v{{version}}",
"copyVersion": "複製版本資訊",
"runtime": "執行環境",
@@ -127,8 +129,9 @@
"localData": "本機資料",
"sessionsSettings": "連線與設定",
"masterKeyPath": "加密主金鑰",
"privacyNote": "密碼與金鑰口令由 Rust 使用 AES-256-GCM 加密。OpsXShell 不儲存終端機命令歷史。",
"license": "MIT License · Rust · XTerm.js"
"privacyNote": "密碼與金鑰口令由 Rust 使用 AES-256-GCM 加密。不保存終端機指令歷史,也不做堡壘稽核。",
"license": "MIT License · Rust · XTerm.js",
"logPath": "應用程式日誌"
},
"ai": {
"presets": "供應商預設",
@@ -162,13 +165,42 @@
"apiKeySaveFailed": "API Key 儲存失敗",
"providerNotFound": "Provider 不存在",
"modelCatalogReadFailed": "模型目錄讀取失敗",
"catalogUnavailable": "models.dev 暫不可用"
"catalogUnavailable": "models.dev 暫不可用",
"family": {
"openai_compatible": "OpenAI 相容",
"standalone": "獨立協定",
"plan": "方案套餐",
"local": "本機私有化",
"custom": "自訂"
}
},
"family": {
"openai_compatible": "OpenAI 相容",
"standalone": "────────",
"plan": "Plan 計劃",
"local": "私有化本機",
"custom": "Custom 自訂"
"account": {
"title": "帳戶",
"email": "電子郵件",
"emailDesc": "用於結帳與領取授權",
"plan": "目前方案",
"planFree": "免費",
"planYearly": "專業版年繳",
"planPerpetual": "專業版永久",
"planTrial": "專業版體驗",
"expires": "有效至 {{date}}",
"lifetime": "終身有效",
"devices": "裝置席位:最多 {{count}} 台",
"deviceId": "本機裝置 ID",
"saveEmail": "儲存電子郵件",
"activate": "啟用授權",
"pasteLicense": "貼上 LIC- 授權碼",
"clear": "清除本機授權",
"deactivate": "停用本機啟用",
"upgrade": "升級專業版",
"saved": "已儲存",
"activateOk": "啟用成功",
"deviceList": "已綁定裝置",
"loadingDevices": "載入裝置列表…",
"noDevices": "暫無綁定裝置",
"thisDevice": "本機",
"removeDevice": "解除綁定",
"deviceRemoved": "已解除該裝置綁定",
"seatFull": "裝置席位已滿。請先解除其他裝置,再在新機器上啟用。"
}
}
+54 -24
View File
@@ -3,8 +3,9 @@
"local": "本機",
"remote": "遠端",
"notConnectedTitle": "未連線到遠端伺服器",
"notConnectedDesc": "請先連線 SSH 工作階段以使用 SFTP",
"ariaLabel": "{{title}}檔案面板"
"notConnectedDesc": "先連上 SSH,再傳檔、改設定",
"ariaLabel": "{{title}}檔案面板",
"reconnectResumeDesc": "連線中斷。一鍵重連後回到 {{path}}"
},
"connection": {
"selectServer": "選擇伺服器",
@@ -12,7 +13,9 @@
"createSessionHint": "請先在側邊欄建立連線",
"reconnect": "重新連線",
"notConnected": "未連線",
"connecting": "連線中..."
"connecting": "連線中...",
"resumeHint": "重連後將回到 {{path}}",
"reconnectingResume": "正在重連並恢復 {{path}}…"
},
"errors": {
"notConnected": "SFTP 尚未連線",
@@ -23,19 +26,14 @@
"selectDownloadFiles": "請先選擇要下載的檔案",
"uploadFailed": "上傳失敗",
"downloadFailed": "下載失敗",
"fileError": "{{fileName}}: {{message}}"
"fileError": "{{fileName}}: {{message}}",
"mkdirFailed": "建立資料夾失敗"
},
"toolbar": {
"upload": "上傳",
"uploadAria": "上傳",
"download": "下載",
"downloadAria": "下載",
"downloadNeedSelection": "請先選擇遠端檔案",
"downloadHint": "下載選中的遠端檔案",
"refresh": "重新整理",
"refreshAria": "重新整理",
"refreshAria": "重新整理目前面板",
"newFolder": "新增資料夾",
"newFolderAria": "新增資料夾"
"newFolderAria": "在目前面板新增資料夾"
},
"sort": {
"name": "名稱",
@@ -55,7 +53,8 @@
"hideHidden": "隱藏點檔案(.xxx)",
"showHiddenAria": "顯示隱藏檔案",
"hideHiddenAria": "隱藏點檔案",
"searchAria": "{{title}} 目前資料夾搜尋"
"searchAria": "{{title}} 目前資料夾搜尋",
"upAtRoot": "已在根目錄"
},
"status": {
"loading": "載入中...",
@@ -63,7 +62,8 @@
"filtered": "顯示 {{shown}} / {{total}} 項",
"hiddenCount": "共 {{total}} 項(已隱藏 {{hidden}})",
"total": "共 {{count}} 項",
"filterHint": "篩選: {{query}}"
"filterHint": "篩選: {{query}}",
"refreshing": "正在重新整理..."
},
"empty": {
"dirTitle": "目錄為空",
@@ -99,7 +99,6 @@
"download": "下載",
"edit": "編輯",
"rename": "重新命名",
"copyPath": "複製路徑",
"properties": "屬性",
"permissions": "權限",
"delete": "刪除"
@@ -116,7 +115,18 @@
"chmodTitle": "權限編輯",
"chmodApply": "套用",
"pickUploadTitle": "選擇要上傳的檔案或資料夾",
"pickUploadRzTitle": "選擇要上傳的檔案(rz)"
"pickUploadRzTitle": "選擇要上傳的檔案(rz)",
"overwriteTitle": "覆蓋既有檔案?",
"overwriteConfirm": "覆蓋",
"overwriteSkip": "跳過",
"overwriteOneRemote": "遠端已存在「{{name}}」,覆蓋?",
"overwriteOneLocal": "本機已存在「{{name}}」,覆蓋?",
"overwriteManyRemote": "遠端已有 {{count}} 個同名項目,覆蓋全部?",
"overwriteManyLocal": "本機已有 {{count}} 個同名項目,覆蓋全部?",
"overwriteMore": "…另有 {{count}} 個",
"deleteTitle": "確認刪除",
"deleteMessage": "將刪除 {{count}} 項:{{names}}",
"deleteRecursiveWarn": "其中包含目錄,會遞迴刪除且無法復原。"
},
"properties": {
"name": "名稱",
@@ -152,27 +162,41 @@
"statusDone": "完成",
"statusFailed": "失敗",
"statusCancelled": "已取消",
"dropUpload": "上傳到 {{path}}",
"dropDownload": "下載到 {{path}}"
"dropUpload": "拖放到此處上傳到 {{path}}",
"dropDownload": "拖放到此處下載到 {{path}}",
"railAria": "本機與遠端之間傳輸",
"railUpload": "上傳選取的本機檔案(未選取時可開啟檔案選擇器)",
"railDownload": "下載選取的遠端檔案到本機",
"railUploadAria": "上傳到遠端",
"railDownloadAria": "下載到本機",
"railDownloadNeedSelection": "請先選擇遠端檔案",
"retry": "重試"
},
"editor": {
"readFailed": "讀取失敗",
"saveFailed": "儲存失敗",
"unsavedClose": "有未儲存的修改,確定關閉?",
"unsavedTitle": "未儲存的修改",
"discardAndClose": "放棄並關閉",
"reloadTitle": "重新載入",
"discardAndReload": "放棄並重新載入",
"saving": "儲存中...",
"save": "儲存",
"saved": "檔案已儲存",
"loadingEditor": "載入編輯器...",
"footer": "UTF-8 · Monaco · ⌘/Ctrl+S 儲存 · 最大約 2MB",
"loadBlocked": "無法載入檔案內容",
"footer": "UTF-8 · ⌘/Ctrl+S 儲存 · Esc 關閉 · 最大約 2MB",
"charCount": "{{count}} 字元",
"unsavedMark": " · 未儲存",
"savedMark": " · 已儲存"
"savedMark": " · 已儲存",
"title": "編輯 {{name}}",
"dirtyBadge": "未儲存",
"reload": "重新載入",
"unsavedReload": "有未儲存的修改,確定重新載入並捨棄?"
},
"toast": {
"renamed": "已重新命名為 {{name}}",
"renameFailed": "重新命名失敗",
"pathCopied": "路徑已複製到剪貼簿",
"pathCopyFailed": "複製路徑失敗",
"chmodUpdated": "權限已更新為 {{mode}}",
"chmodFailed": "權限修改失敗",
"uploadPartial": "{{action}}完成 {{completed}} 個,失敗 {{failed}} 個:{{detail}}",
@@ -180,7 +204,13 @@
"uploadAction": "上傳",
"downloadAction": "下載",
"noFolderUpload": "上傳資料夾失敗",
"noDragPath": "目前系統未提供拖曳檔案路徑,請使用「上傳」按鈕選擇檔案",
"noFolderRecursive": "資料夾遞迴傳輸失敗,請重試或改用上傳按鈕"
"noDragPath": "目前系統未提供拖曳路徑。請用中間 → 箭頭或選擇檔案上傳。",
"noFolderRecursive": "資料夾傳輸失敗。請重試,或使用中間 → 箭頭 / 檔案選擇器。",
"dropFailed": "拖放失敗:無法讀取檔案資訊。請再試,或使用中間箭頭傳輸。",
"folderCreated": "已建立資料夾 {{name}}",
"allSkippedExisting": "同名檔案均已跳過",
"skippedExisting": "已跳過 {{count}} 個同名檔案",
"deleteFailed": "刪除失敗",
"deleted": "已刪除"
}
}
+3 -2
View File
@@ -34,7 +34,7 @@
"reopenShell": "重新開啟 Shell",
"reopening": "正在開啟…",
"disconnected": "連線已中斷",
"disconnectedHint": "SSH 連線已結束或網路中斷。點擊下方一鍵重新連線。",
"disconnectedHint": "SSH 連線已結束或網路中斷。點下方一鍵重新連線,即可繼續工作。",
"reconnect": "重新連線",
"suspended": "連線已暫停",
"suspendedHint": "長時間未操作,連線已進入暫停以節省資源",
@@ -70,7 +70,8 @@
"splitRight": "向右分割",
"splitDown": "向下分割",
"maximizePane": "最大化目前窗格",
"restoreLayout": "還原分割版面"
"restoreLayout": "還原分割版面",
"openSftp": "開啟 SFTP"
},
"search": {
"placeholder": "搜尋...",