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:
1 parent
fea6d8db04
commit
b0d0e3a5f3
301 files changed
+28002
-2705
No files matched your search
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "Agent CLI",
|
||||
"modelConfigured": "{{provider}} · {{model}}",
|
||||
"modelNotConfigured": "No model configured",
|
||||
"sshReady": "SSH · {{target}}",
|
||||
"sshNotConnected": "No remote SSH connected",
|
||||
"defaultTarget": "Current SSH session",
|
||||
"emptyHint": "Describe an ops task and send. Follow up in the same thread, or tap + for a new topic.",
|
||||
"newTopic": "New topic",
|
||||
"close": "Close",
|
||||
"thinking": "Thinking…",
|
||||
"conclusion": "Conclusion",
|
||||
"copy": "Copy",
|
||||
"copied": "Copied",
|
||||
"stop": "Stop",
|
||||
"send": "Send",
|
||||
"placeholder": "Task or follow-up… (Enter to send, Shift+Enter for newline)",
|
||||
"hintFollowUp": "Follow-ups include this thread's context",
|
||||
"hintSelection": "Will include {{lines}} selected lines",
|
||||
"hintSteps": "Up to {{max}} steps · nothing persisted",
|
||||
"footerNote": "High risk requires confirmation · critical is blocked · session not saved"
|
||||
},
|
||||
"safety": {
|
||||
"aria": "Agent safety mode",
|
||||
"strict": {
|
||||
"label": "Strict",
|
||||
"short": "Confirm from medium risk",
|
||||
"description": "File changes, permission edits, and higher-risk commands need confirmation. Best for production or unfamiliar hosts."
|
||||
},
|
||||
"relaxed": {
|
||||
"label": "Relaxed",
|
||||
"short": "Confirm high risk only",
|
||||
"description": "Read-only and routine edits run automatically; deletes, restarts, installs, etc. need confirmation."
|
||||
}
|
||||
},
|
||||
"risk": {
|
||||
"safe": "Safe",
|
||||
"low": "Low risk",
|
||||
"medium": "Medium risk",
|
||||
"high": "High risk",
|
||||
"critical": "Blocked"
|
||||
},
|
||||
"step": {
|
||||
"round": "Step {{round}}",
|
||||
"awaiting": "Awaiting approval",
|
||||
"running": "Running",
|
||||
"done": "Done",
|
||||
"confirmTitle": "Step {{round}} · {{risk}}",
|
||||
"confirmMessage": "SSH · {{target}}\n{{mode}}\n\n$ {{command}}",
|
||||
"rejected": "Step {{round}} command rejected.",
|
||||
"terminated": "Terminated",
|
||||
"stoppedMessage": "Stopped. Interrupt requested for the running remote command."
|
||||
},
|
||||
"confirm": {
|
||||
"reject": "Reject",
|
||||
"once": "Once",
|
||||
"always": "Always",
|
||||
"hint": "Enter · Once Esc · Reject Always · skip similar confirmations this session"
|
||||
},
|
||||
"error": {
|
||||
"noProvider": "Configure an AI provider in Settings → AI first",
|
||||
"noApiKey": "No API key saved for \"{{provider}}\"",
|
||||
"emptyTask": "Enter a task or follow-up",
|
||||
"sshRequired": "A connected remote SSH session is required",
|
||||
"modelEmpty": "Model returned no content",
|
||||
"protocolFailed": "Model failed the tool protocol twice; stopped",
|
||||
"noConclusion": "Model returned no usable conclusion",
|
||||
"multipleCommands": "Model returned multiple commands; execution refused",
|
||||
"invalidCommand": "Model did not return a single one-line command; execution refused",
|
||||
"repeatLoop": "Repeated command loop detected; stopped: {{command}}",
|
||||
"criticalBlocked": "Command hit a destructive hard block; no override: {{command}}",
|
||||
"execFailed": "ssh-exec failed: {{error}}",
|
||||
"execUnknown": "Unknown error",
|
||||
"execNoOutput": "Command finished with no output",
|
||||
"maxSteps": "Reached {{max}}-step limit; narrow the scope and retry"
|
||||
},
|
||||
"output": {
|
||||
"empty": "(empty output)",
|
||||
"truncatedMiddle": "... [{{count}} lines omitted] ...",
|
||||
"totalLines": "Total lines: {{count}}{{truncatedSuffix}}",
|
||||
"truncatedSuffix": " (head/tail preserved)",
|
||||
"errorLines": "Possible error/warning lines ({{count}}):\n{{lines}}",
|
||||
"noErrorKeywords": "No obvious error keywords found",
|
||||
"snippetLabel": "Output snippet:\n{{snippet}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,326 @@
|
||||
{
|
||||
"action": {
|
||||
"confirm": "Confirm",
|
||||
"cancel": "Cancel",
|
||||
"close": "Close",
|
||||
"delete": "Delete",
|
||||
"save": "Save",
|
||||
"create": "Create",
|
||||
"copy": "Copy",
|
||||
"copied": "Copied",
|
||||
"refresh": "Refresh",
|
||||
"gotIt": "Got it",
|
||||
"edit": "Edit",
|
||||
"open": "Open",
|
||||
"clone": "Clone",
|
||||
"reconnect": "Reconnect",
|
||||
"disconnect": "Disconnect",
|
||||
"submit": "OK"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Loading...",
|
||||
"processing": "Processing...",
|
||||
"connecting": "Connecting...",
|
||||
"connected": "Connected",
|
||||
"disconnected": "Disconnected",
|
||||
"background": "Background",
|
||||
"suspended": "Suspended",
|
||||
"reconnecting": "Reconnecting",
|
||||
"error": "Connection error",
|
||||
"reading": "Loading...",
|
||||
"saving": "Saving..."
|
||||
},
|
||||
"error": {
|
||||
"title": "Something went wrong",
|
||||
"body": "The app hit an unexpected problem",
|
||||
"recoverable": "This error is recoverable. Try refreshing the page.",
|
||||
"refreshPage": "Refresh page",
|
||||
"restartApp": "Restart app",
|
||||
"supportHint": "If the problem persists, check logs or contact support"
|
||||
},
|
||||
"toast": {
|
||||
"closeAria": "Dismiss notification"
|
||||
},
|
||||
"metrics": {
|
||||
"timezone": "Timezone {{value}}",
|
||||
"memory": "Memory {{percent}}%{{detail}}",
|
||||
"sessionTransfer": "Session traffic {{value}}"
|
||||
},
|
||||
"palette": {
|
||||
"title": "Command palette",
|
||||
"aria": "Command palette",
|
||||
"placeholder": "Search commands, sessions, or snippets...",
|
||||
"empty": "No matching results",
|
||||
"emptyHint": "Try a different keyword",
|
||||
"resultCount": "{{count}} results",
|
||||
"badge": {
|
||||
"command": "Command",
|
||||
"session": "Session",
|
||||
"snippet": "Snippet"
|
||||
},
|
||||
"hint": {
|
||||
"nav": "Navigate",
|
||||
"run": "Run",
|
||||
"close": "Close"
|
||||
},
|
||||
"cmd": {
|
||||
"newSession": "New session",
|
||||
"newSessionDesc": "Create a new SSH session profile",
|
||||
"quickConnect": "Quick connect",
|
||||
"quickConnectDesc": "Connect with host details directly",
|
||||
"localTerminal": "Local terminal",
|
||||
"localTerminalDesc": "Open a local shell",
|
||||
"settings": "Open settings",
|
||||
"settingsDesc": "App preferences",
|
||||
"toggleSidebar": "Toggle sidebar",
|
||||
"toggleSidebarDesc": "Hide the sidebar to focus on the terminal",
|
||||
"newTab": "New tab",
|
||||
"closeTab": "Close current tab",
|
||||
"closeAllTabs": "Close all tabs",
|
||||
"portForward": "New port forward",
|
||||
"upgradePro": "Upgrade OpsXShell Pro",
|
||||
"editSession": "Edit session: {{name}}"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"welcome": "Welcome",
|
||||
"new": "New tab",
|
||||
"settings": "Settings",
|
||||
"portForward": "Port forward",
|
||||
"terminal": "Terminal",
|
||||
"batch": "Batch exec",
|
||||
"newTerminal": "New terminal",
|
||||
"kind": {
|
||||
"terminal": "Terminal",
|
||||
"sftp": "SFTP",
|
||||
"portforward": "Forward",
|
||||
"serial": "Serial",
|
||||
"rdp": "RDP",
|
||||
"vnc": "VNC",
|
||||
"batch": "Batch",
|
||||
"settings": "Settings"
|
||||
},
|
||||
"menu": {
|
||||
"closeOthers": "Close others",
|
||||
"closeRight": "Close tabs to the right",
|
||||
"closeLeft": "Close tabs to the left",
|
||||
"closeAll": "Close all",
|
||||
"clone": "Duplicate tab"
|
||||
}
|
||||
},
|
||||
"sidebar": {
|
||||
"brandSub": "SSH / SFTP terminal",
|
||||
"collapse": "Collapse sidebar (Ctrl/Cmd+B)",
|
||||
"collapseAria": "Collapse sidebar",
|
||||
"expand": "Expand sidebar",
|
||||
"expandAria": "Expand sidebar",
|
||||
"toggle": "Toggle sidebar",
|
||||
"searchPlaceholder": "Search...",
|
||||
"localShell": {
|
||||
"openDefault": "Open default local shell",
|
||||
"choose": "Choose shell",
|
||||
"title": "Local shell",
|
||||
"subtitle": "Open a terminal on this machine",
|
||||
"default": "Default"
|
||||
}
|
||||
},
|
||||
"connectionPanel": {
|
||||
"title": "Connections",
|
||||
"empty": "No connections",
|
||||
"emptyDesc": "No active connections. They will appear here after you connect to a server.",
|
||||
"stat": {
|
||||
"total": "Total",
|
||||
"active": "Active",
|
||||
"background": "Background",
|
||||
"error": "Disconnected/error"
|
||||
},
|
||||
"status": {
|
||||
"connected": "Connected",
|
||||
"connecting": "Connecting",
|
||||
"background": "Background",
|
||||
"suspended": "Suspended",
|
||||
"error": "Error",
|
||||
"disconnected": "Disconnected",
|
||||
"reconnecting": "Reconnecting"
|
||||
},
|
||||
"refCount": "×{{count}} refs",
|
||||
"reconnect": "Reconnect",
|
||||
"reconnecting": "Reconnecting...",
|
||||
"disconnect": "Disconnect"
|
||||
},
|
||||
"pro": {
|
||||
"upgrade": "Upgrade Pro",
|
||||
"feature": "Pro features",
|
||||
"unlock": "Unlock {{feature}}",
|
||||
"comingSoon": "Coming soon",
|
||||
"activateSuccess": "Activated",
|
||||
"activateFailed": "Activation failed",
|
||||
"licenseActivated": "Pro license activated",
|
||||
"paymentPending": "After payment, paste your license here or try activating again later",
|
||||
"invalidLicense": "Activation failed: invalid license",
|
||||
"goUpgrade": "Upgrade",
|
||||
"haveLicense": "Have a license? Activate",
|
||||
"title": "OpsXShell Pro · Unlock pro ops features",
|
||||
"subtitleComingSoon": "{{feature}} coming soon · upgrade Pro for early access",
|
||||
"subtitleUnlock": "Unlocking: {{feature}}",
|
||||
"subtitleDefault": "Forwarding, proxy, serial, AI, batch, and broadcast",
|
||||
"activated": "Pro activated",
|
||||
"expiresAt": " · valid until {{date}}",
|
||||
"lifetime": " · lifetime license",
|
||||
"oneTimeFee": "One-time purchase · lifetime on this device · no subscription",
|
||||
"pasteLicense": "Paste license",
|
||||
"activateButton": "Activate",
|
||||
"clearLicense": "Clear local license",
|
||||
"paymentNote": "Checkout is handled by Waffo; this app does not collect card details.",
|
||||
"testDeviceId": "Test environment · device ID: {{deviceId}}",
|
||||
"later": "Maybe later",
|
||||
"viewPro": "View Pro",
|
||||
"wallComingSoonSuffix": " · coming soon",
|
||||
"wallUnlock": "Unlock {{feature}}",
|
||||
"wallMessageComingSoon": "This Pro capability is still in development. Upgrade for early access.",
|
||||
"wallMessageDefault": "This feature requires OpsXShell Pro. Upgrade to use it on this device.",
|
||||
"checkoutUnavailable": "Checkout unavailable ({{status}})",
|
||||
"freeTier": "Free",
|
||||
"proTier": "Pro",
|
||||
"freeItems": {
|
||||
"ssh": "SSH terminal",
|
||||
"sftp": "SFTP file manager",
|
||||
"local": "Local terminal",
|
||||
"crud": "Session CRUD",
|
||||
"import": "Single / ssh_config import"
|
||||
},
|
||||
"proItems": {
|
||||
"forward": "Port forwarding",
|
||||
"proxy": "Session proxy / SOCKS",
|
||||
"serial": "Serial terminal",
|
||||
"ai": "Terminal AI assistant",
|
||||
"batch": "Batch exec / broadcast sync",
|
||||
"broadcast": "Broadcast input sync",
|
||||
"importExport": "Bulk import/export hosts",
|
||||
"desktop": "RDP / VNC remote desktop"
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"title": "Quick launch",
|
||||
"description": "Sessions, local shells, and device consoles",
|
||||
"cards": {
|
||||
"quickConnect": { "title": "Quick connect", "desc": "user@host:port" },
|
||||
"saveSession": { "title": "Save session", "desc": "Credentials, groups, proxy" },
|
||||
"serial": { "title": "Serial terminal", "desc": "Baud rate and port settings" }
|
||||
},
|
||||
"sectionLocalShell": "Local shell",
|
||||
"sectionSavedSessions": "Saved sessions",
|
||||
"systemDefault": "System default"
|
||||
},
|
||||
"statusBar": {
|
||||
"socksLabel": "Forwarding",
|
||||
"socksIdle": "Open port forward · right-click to copy SOCKS",
|
||||
"socksRunning": "SOCKS5 running · click to manage · right-click to copy",
|
||||
"forwardOpenIdle": "Open port forward · right-click to copy socks5://127.0.0.1:{{port}}",
|
||||
"forwardOpenRunning": "SOCKS5 running (:{{port}}) · click to manage · right-click to copy",
|
||||
"forwardStarted": "Forward started",
|
||||
"forwardStartedDynamic": "SOCKS5 started: socks5://127.0.0.1:{{port}}",
|
||||
"socksStartFailed": "Start failed: {{message}}",
|
||||
"socksStopFailed": "Stop failed: {{message}}",
|
||||
"socksCopied": "Copied socks5://127.0.0.1:{{port}}"
|
||||
},
|
||||
"portForward": {
|
||||
"title": "Port Forwarding",
|
||||
"connectedAs": "Connected: {{target}}",
|
||||
"notConnected": "Not connected — establish SSH first",
|
||||
"socksDefaultHint": "Local SOCKS5: 127.0.0.1:1080",
|
||||
"socksRunning": "SOCKS5 running",
|
||||
"socksStart": "Start SOCKS5",
|
||||
"addRule": "Add",
|
||||
"emptyTitle": "No port forwards",
|
||||
"emptyDesc": "Start SOCKS5, or add Local / Remote rules",
|
||||
"emptyAction": "Start 127.0.0.1:1080",
|
||||
"typeLocal": "Local",
|
||||
"typeRemote": "Remote",
|
||||
"typeDynamic": "Dynamic",
|
||||
"running": "Running",
|
||||
"socksProxy": "SOCKS5: 127.0.0.1:{{port}}",
|
||||
"remoteToLocal": "Remote {{remote}} → local {{local}}",
|
||||
"stats": "{{connections}} conn · ↑{{up}} · ↓{{down}}",
|
||||
"copyProxy": "Copy proxy",
|
||||
"copyRule": "Duplicate rule",
|
||||
"editRule": "Edit",
|
||||
"stopListener": "Stop",
|
||||
"start": "Start",
|
||||
"delete": "Delete",
|
||||
"editTitle": "Edit forward",
|
||||
"addTitle": "Add forward",
|
||||
"typeLocalDesc": "Local → remote",
|
||||
"typeRemoteDesc": "Remote → local",
|
||||
"typeDynamicDesc": "SOCKS5",
|
||||
"selectType": "Type",
|
||||
"drawerSubtitle": "Tunnel via the current SSH session",
|
||||
"ruleFields": "Details",
|
||||
"dynamicHint": "Local SOCKS5, default 127.0.0.1:1080 (editable). Traffic exits via this SSH server's public IP.",
|
||||
"dynamicSingleHint": "One Dynamic rule per SSH host; change the listen port while stopped.",
|
||||
"dynamicPortHint": "If the port is busy, pick another local port (e.g. 1081).",
|
||||
"ruleList": "Rules",
|
||||
"ruleListEmpty": "No Local / Remote rules yet",
|
||||
"addSection": "Add new",
|
||||
"errorDynamicExists": "Dynamic already exists. Start/stop it, or change the port.",
|
||||
"diagram": {
|
||||
"title": "How it works",
|
||||
"localApp": "Local app",
|
||||
"sshHost": "SSH host",
|
||||
"remoteService": "Remote service",
|
||||
"remoteClient": "Remote client",
|
||||
"localService": "Local service",
|
||||
"localClient": "Local",
|
||||
"browser": "Local client",
|
||||
"socksProxy": "Local SOCKS",
|
||||
"anyTarget": "Any destination",
|
||||
"localSide": "Local",
|
||||
"remoteSide": "Remote",
|
||||
"firewall": "Firewall",
|
||||
"viaApp": "via OpsXShell",
|
||||
"viaSsh": "via SSH",
|
||||
"toTarget": "to target",
|
||||
"toListen": "to listen",
|
||||
"targetDb": "DB",
|
||||
"targetWeb": "Web",
|
||||
"targetApi": "API",
|
||||
"remotePeerA": "Remote A",
|
||||
"remotePeerB": "Remote B",
|
||||
"remotePeerC": "Remote C",
|
||||
"cloudA": "Cloud A",
|
||||
"cloudB": "Cloud B",
|
||||
"internet": "Internet",
|
||||
"localCaption": "Local: reach a remote port as if it were local.",
|
||||
"remoteCaption": "Remote: remote access is forwarded to a local service.",
|
||||
"dynamicCaption": "Dynamic: this machine becomes a SOCKS5 proxy that exits via the current SSH server's public IP."
|
||||
},
|
||||
"ruleName": "Name",
|
||||
"ruleNamePlaceholder": "e.g. MySQL",
|
||||
"localListenPort": "Local listen port",
|
||||
"localTargetPort": "Local target port",
|
||||
"remoteTargetPort": "Remote target port",
|
||||
"remoteListenPort": "Remote listen port",
|
||||
"portPlaceholder": "e.g. 3306",
|
||||
"remoteHost": "Remote host",
|
||||
"remoteHostPlaceholder": "localhost or IP",
|
||||
"socksRuleName": "SOCKS5 proxy",
|
||||
"defaultLocalName": "Local forward",
|
||||
"defaultRemoteName": "Remote forward",
|
||||
"sessionRestoredTitle": "Session restored",
|
||||
"sessionRestoredDesc": "The port-forward tab from your last session was restored.\nReconnect SSH to use it again.",
|
||||
"stopEditTitle": "Stop before editing",
|
||||
"stopEditMessage": "This forward is running. Stop it before editing?",
|
||||
"stopEditConfirm": "Stop and edit",
|
||||
"deleteTitle": "Delete rule",
|
||||
"deleteRunning": "Running forward will be stopped first.",
|
||||
"deleteConfirm": "Delete this rule?",
|
||||
"errorNamePort": "Enter a name and a valid port (1–65535)",
|
||||
"errorTargetPort": "Enter a valid target port (1–65535)",
|
||||
"errorRemoteHost": "Enter a remote host",
|
||||
"errorNotConnected": "Not connected",
|
||||
"errorStartFailed": "Start failed",
|
||||
"errorStopFailed": "Stop failed",
|
||||
"errorSocksRunning": "SOCKS5 already running",
|
||||
"copySuffix": "Copy"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"connect": {
|
||||
"rdpTitle": "Connect RDP",
|
||||
"vncTitle": "Connect VNC",
|
||||
"rdpDesc": "Windows remote desktop · native IronRDP engine",
|
||||
"vncDesc": "VNC / RFB remote desktop · native engine",
|
||||
"confirm": "Connect",
|
||||
"host": "Host",
|
||||
"hostPlaceholderRdp": "windows.example.com",
|
||||
"hostPlaceholderVnc": "192.168.1.10",
|
||||
"port": "Port",
|
||||
"username": "Username",
|
||||
"domain": "Domain (optional)",
|
||||
"password": "Password",
|
||||
"passwordOptional": "Password (optional)",
|
||||
"width": "Width",
|
||||
"height": "Height",
|
||||
"rdpFootnote": "Native IronRDP: TCP → X.224 → TLS → CredSSP/NLA → MCS; 45s handshake timeout. Certificate verification is relaxed during development.",
|
||||
"vncFootnote": "Native vnc-rs RFB with Tight JPEG decoding; clipboard is sent as UTF-8 (very old servers may garble text).",
|
||||
"errorHostRequired": "Enter a host address",
|
||||
"errorUsernameRequired": "Enter a username"
|
||||
},
|
||||
"toolbar": {
|
||||
"pasteClipboard": "Paste local clipboard to remote",
|
||||
"pasteAria": "Paste to remote",
|
||||
"shareDrive": "Copy a local file into the shared drive (local Downloads = remote Downloads on OpsXShell)",
|
||||
"shareDriveAria": "Add to shared drive",
|
||||
"openShareDir": "Open shared folder locally (Downloads)",
|
||||
"openShareDirAria": "Open shared folder",
|
||||
"disconnect": "Disconnect",
|
||||
"disconnectAria": "Disconnect"
|
||||
},
|
||||
"status": {
|
||||
"connecting": "Connecting…",
|
||||
"connected": "Connected",
|
||||
"disconnected": "Disconnected",
|
||||
"connectFailed": "Connection failed",
|
||||
"clipboardSynced": "Remote clipboard synced",
|
||||
"savedToDownloads": "Saved to local Downloads: {{name}}",
|
||||
"pastedToRemote": "Pasted to remote",
|
||||
"fileTooLarge": "Single file limit is 50MB",
|
||||
"fileShared": "Added to shared Downloads: {{name}} (visible on remote This PC)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"code": {
|
||||
"1000": "Connection failed. Check the network or host address.",
|
||||
"1001": "Connection timed out. Check the network or try again later.",
|
||||
"1002": "Authentication failed. Check the username and password.",
|
||||
"1003": "Host unreachable. Check network settings.",
|
||||
"1004": "Connection closed",
|
||||
"1100": "Failed to create terminal",
|
||||
"1101": "Command execution failed",
|
||||
"1102": "Port forward setup failed",
|
||||
"1200": "SFTP connection failed",
|
||||
"1201": "File not found",
|
||||
"1202": "Permission denied for this file or directory",
|
||||
"1203": "File transfer failed",
|
||||
"1204": "Could not read directory contents",
|
||||
"1300": "Session not found",
|
||||
"1301": "Failed to save session",
|
||||
"1302": "Failed to load session",
|
||||
"1400": "Invalid host address format",
|
||||
"1401": "Port must be between 1 and 65535",
|
||||
"1402": "Invalid credential format",
|
||||
"9000": "An unknown error occurred",
|
||||
"9001": "Internal communication error",
|
||||
"9002": "File system error",
|
||||
"9003": "Network error"
|
||||
},
|
||||
"action": {
|
||||
"retry": "Retry",
|
||||
"reconnect": "Reconnect",
|
||||
"ignore": "Ignore",
|
||||
"exit": "Exit",
|
||||
"none": "None"
|
||||
},
|
||||
"connection": {
|
||||
"failed": "Connection failed. Check the network or host address.",
|
||||
"timeout": "Connection timed out. Check the network or try again later.",
|
||||
"authFailed": "Authentication failed. Check the username and password.",
|
||||
"hostUnreachable": "Host unreachable. Check network settings.",
|
||||
"closed": "Connection closed",
|
||||
"dnsFailed": "Could not resolve host",
|
||||
"refused": "Connection refused",
|
||||
"disconnected": "Disconnected"
|
||||
},
|
||||
"auth": {
|
||||
"failed": "Authentication failed. Check the username and password.",
|
||||
"invalidCredentials": "Invalid credential format",
|
||||
"keyLoadFailed": "Failed to load private key",
|
||||
"passphraseRequired": "Private key requires a passphrase",
|
||||
"passphraseWrong": "Incorrect private key passphrase"
|
||||
},
|
||||
"shell": {
|
||||
"createFailed": "Failed to create terminal",
|
||||
"execFailed": "Command execution failed",
|
||||
"localCreateFailed": "Failed to create local shell",
|
||||
"remoteCreateFailed": "Failed to create remote shell"
|
||||
},
|
||||
"proxy": {
|
||||
"connectFailed": "Proxy connection failed",
|
||||
"authFailed": "Proxy authentication failed",
|
||||
"tunnelFailed": "Failed to establish proxy tunnel",
|
||||
"unsupported": "Unsupported proxy type",
|
||||
"jumpFailed": "Jump host connection failed",
|
||||
"hostRequired": "Proxy host is required",
|
||||
"hostNoSpaces": "Proxy host cannot contain spaces",
|
||||
"portRequired": "Proxy port must be greater than 0",
|
||||
"portTooHigh": "Proxy port cannot exceed 65535"
|
||||
},
|
||||
"forward": {
|
||||
"failed": "Port forward setup failed",
|
||||
"bindFailed": "Failed to bind port",
|
||||
"alreadyInUse": "Port already in use"
|
||||
},
|
||||
"sftp": {
|
||||
"connectFailed": "SFTP connection failed",
|
||||
"fileNotFound": "File not found",
|
||||
"permissionDenied": "Permission denied for this file or directory",
|
||||
"transferFailed": "File transfer failed",
|
||||
"listFailed": "Could not read directory contents",
|
||||
"readFailed": "Read failed",
|
||||
"writeFailed": "Save failed",
|
||||
"renameFailed": "Rename failed",
|
||||
"chmodFailed": "Failed to update permissions",
|
||||
"apiUnavailable": "SFTP API unavailable"
|
||||
},
|
||||
"session": {
|
||||
"notFound": "Session not found",
|
||||
"saveFailed": "Failed to save session",
|
||||
"loadFailed": "Failed to load session",
|
||||
"readConfigFailed": "Could not read session config",
|
||||
"exportWriteFailed": "Failed to write export file",
|
||||
"exportFailed": "Session export failed",
|
||||
"importReadFailed": "Failed to read file",
|
||||
"importFailed": "Session import failed",
|
||||
"importEmpty": "No importable sessions found"
|
||||
},
|
||||
"validation": {
|
||||
"invalidHost": "Invalid host address format",
|
||||
"invalidPort": "Port must be between 1 and 65535",
|
||||
"invalidCredentials": "Invalid credential format",
|
||||
"hostRequired": "Enter a host address",
|
||||
"usernameRequired": "Enter a username",
|
||||
"targetRequired": "Enter a host, e.g. root@192.168.1.10 or opsbase.cn:5555",
|
||||
"serialPathRequired": "Enter a serial device path",
|
||||
"taskRequired": "Enter a task or follow-up"
|
||||
},
|
||||
"filesystem": {
|
||||
"error": "File system error",
|
||||
"readFailed": "Failed to read file",
|
||||
"writeFailed": "Failed to write file"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Failed to read clipboard",
|
||||
"writeFailed": "Failed to write clipboard",
|
||||
"copyPathFailed": "Failed to copy path",
|
||||
"unsupportedRead": "Reading the clipboard is not supported in this environment",
|
||||
"unsupportedWrite": "Writing to the clipboard is not supported in this environment"
|
||||
},
|
||||
"ipc": {
|
||||
"error": "Internal communication error",
|
||||
"nativeApiUnavailable": "Native API unavailable"
|
||||
},
|
||||
"network": {
|
||||
"error": "Network error"
|
||||
},
|
||||
"pool": {
|
||||
"limitReached": "Connection limit reached ({{max}}). Close some connections first."
|
||||
},
|
||||
"desktop": {
|
||||
"connectFailed": "Connection failed",
|
||||
"fileTooLarge": "Single file limit is 50MB",
|
||||
"nativeOnly": "Remote connections are only available in the OpsXShell Tauri desktop app",
|
||||
"rdpNativeOnly": "RDP is only available in the OpsXShell Tauri desktop app",
|
||||
"vncNativeOnly": "VNC is only available in the OpsXShell Tauri desktop app"
|
||||
},
|
||||
"serial": {
|
||||
"openFailed": "Failed to open serial port",
|
||||
"writeFailed": "Serial write failed",
|
||||
"nativeOnly": "Serial ports are only available in the Tauri desktop app"
|
||||
},
|
||||
"ai": {
|
||||
"noProvider": "Configure an AI provider in Settings → AI first",
|
||||
"noApiKey": "No API key saved for \"{{provider}}\"",
|
||||
"modelEmpty": "Model returned no content",
|
||||
"protocolFailed": "Model failed the tool protocol twice; stopped",
|
||||
"noConclusion": "Model returned no usable conclusion",
|
||||
"multipleCommands": "Model returned multiple commands; execution refused",
|
||||
"invalidCommand": "Model did not return a single one-line command; execution refused",
|
||||
"repeatLoop": "Repeated command loop detected; stopped: {{command}}",
|
||||
"criticalBlocked": "Command hit a destructive hard block; no override: {{command}}",
|
||||
"execFailed": "ssh-exec failed: {{error}}",
|
||||
"maxSteps": "Reached {{max}}-step limit; narrow the scope and retry",
|
||||
"sshRequired": "A connected remote SSH session is required"
|
||||
},
|
||||
"zmodem": {
|
||||
"readFailed": "Read failed: {{name}}",
|
||||
"writeFailed": "Write failed: {{name}}"
|
||||
},
|
||||
"unknown": {
|
||||
"error": "An unknown error occurred"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"connect": {
|
||||
"title": "Connect serial port",
|
||||
"description": "Native serial terminal · routers, switches, boards, and debug consoles",
|
||||
"confirm": "Open port",
|
||||
"device": "Device",
|
||||
"refresh": "Refresh",
|
||||
"devicePlaceholder": "{{path}}",
|
||||
"noDevicesHint": "If no devices are listed, enter a path manually, e.g. {{examples}}.",
|
||||
"examplesWindows": "{{default}}, COM3",
|
||||
"examplesLinux": "{{default}}, /dev/ttyACM0",
|
||||
"examplesMac": "{{default}}, /dev/tty.usbserial-*",
|
||||
"baudRate": "Baud rate",
|
||||
"dataBits": "Data bits",
|
||||
"stopBits": "Stop bits",
|
||||
"parity": "Parity",
|
||||
"parityNone": "None",
|
||||
"parityOdd": "Odd",
|
||||
"parityEven": "Even",
|
||||
"flowControl": "Flow control",
|
||||
"flowNone": "None",
|
||||
"flowSoftware": "Software XON/XOFF",
|
||||
"flowHardware": "Hardware RTS/CTS",
|
||||
"lineEnding": "Line ending",
|
||||
"lineEndingLf": "LF (\\n)",
|
||||
"lineEndingCr": "CR (\\r)",
|
||||
"lineEndingCrlf": "CRLF (\\r\\n)",
|
||||
"localEcho": "Local echo",
|
||||
"localEchoHint": "(half-duplex debugging)",
|
||||
"errorPathRequired": "Enter a serial device path"
|
||||
},
|
||||
"terminal": {
|
||||
"title": "Serial",
|
||||
"connected": "Connected",
|
||||
"disconnected": "Disconnected",
|
||||
"connecting": "Connecting…",
|
||||
"error": "Serial error",
|
||||
"configSummary": "{{path}} · {{baud}} · {{dataBits}}-{{parity}}-{{stopBits}}",
|
||||
"opening": "Opening {{path}} @ {{baud}}...",
|
||||
"openFailed": "Failed to open serial port: {{message}}",
|
||||
"connectedBanner": "Connected {{path}} · {{baud}} {{frame}} · {{lineEnding}}{{echo}}",
|
||||
"localEchoSuffix": " · local echo"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
{
|
||||
"sidebar": {
|
||||
"quickConnect": "Quick connect",
|
||||
"quickConnectShort": "Connect",
|
||||
"newSession": "New session",
|
||||
"newSessionShort": "New",
|
||||
"searchPlaceholder": "Search sessions...",
|
||||
"batchMode": "Batch actions",
|
||||
"exitBatchMode": "Exit batch mode",
|
||||
"batchSelected": "{{count}} SSH selected",
|
||||
"batchExcludedDesktop": " · RDP/VNC excluded",
|
||||
"selectAllVisible": "Select all in view",
|
||||
"deselectAllVisible": "Clear selection in view",
|
||||
"batchExec": "Batch exec",
|
||||
"settings": "Settings",
|
||||
"resizeHint": "Drag to resize; double-click to collapse"
|
||||
},
|
||||
"tree": {
|
||||
"selectSession": "Select session",
|
||||
"noMatchTitle": "No matching sessions",
|
||||
"noMatchDesc": "Try a different keyword",
|
||||
"emptyTitle": "No sessions yet",
|
||||
"emptyDesc": "Quick connect or create a session; double-click to open a terminal",
|
||||
"emptyAction": "New session"
|
||||
},
|
||||
"contextMenu": {
|
||||
"blank": {
|
||||
"newGroup": "New group",
|
||||
"newSession": "New session"
|
||||
},
|
||||
"group": {
|
||||
"newSessionHere": "New session here",
|
||||
"newGroup": "New group",
|
||||
"renameGroup": "Rename group",
|
||||
"deleteEmptyGroup": "Delete empty group"
|
||||
},
|
||||
"session": {
|
||||
"open": "Open",
|
||||
"edit": "Edit",
|
||||
"duplicate": "Duplicate",
|
||||
"delete": "Delete"
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"default": "Default",
|
||||
"new": {
|
||||
"title": "New group",
|
||||
"message": "Enter a group name",
|
||||
"placeholder": "e.g. Production",
|
||||
"confirm": "Create"
|
||||
},
|
||||
"rename": {
|
||||
"title": "Rename group",
|
||||
"message": "Rename \"{{name}}\" to",
|
||||
"placeholder": "Group name",
|
||||
"confirm": "Save"
|
||||
},
|
||||
"deleteBlocked": {
|
||||
"title": "Cannot delete",
|
||||
"message": "Group \"{{name}}\" still has sessions. Move or delete them first.",
|
||||
"confirm": "Got it"
|
||||
},
|
||||
"newOption": "New group…",
|
||||
"hint": "Default group is used unless you pick or create another"
|
||||
},
|
||||
"deleteSession": {
|
||||
"title": "Delete session",
|
||||
"message": "Delete session \"{{name}}\"?",
|
||||
"confirm": "Delete"
|
||||
},
|
||||
"welcome": {
|
||||
"tagline": "Remote terminal · SFTP · Port forwarding",
|
||||
"sectionStart": "Get started",
|
||||
"sectionDesktop": "Remote desktop",
|
||||
"sectionRecent": "Recent sessions",
|
||||
"quickConnect": {
|
||||
"title": "Quick connect",
|
||||
"desc": "One-off SSH; not saved to the library"
|
||||
},
|
||||
"newSession": {
|
||||
"title": "New session",
|
||||
"desc": "Save hosts; double-click in the sidebar to connect"
|
||||
},
|
||||
"localShell": {
|
||||
"title": "Local shell",
|
||||
"selectShell": "Choose shell",
|
||||
"default": "Default"
|
||||
},
|
||||
"rdp": {
|
||||
"title": "RDP remote desktop",
|
||||
"desc": "Windows · NLA / CredSSP"
|
||||
},
|
||||
"vnc": {
|
||||
"title": "VNC remote desktop",
|
||||
"desc": "RFB · cross-platform graphical session"
|
||||
},
|
||||
"recentEmpty": {
|
||||
"title": "No saved sessions",
|
||||
"desc": "Try quick connect, or create a session to reuse later"
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"searchPlaceholder": "Search hosts, groups, or tabs"
|
||||
},
|
||||
"quickConnect": {
|
||||
"title": "Quick connect",
|
||||
"target": "Target",
|
||||
"targetPlaceholder": "root@192.168.1.10:22",
|
||||
"targetHint": "Supports host, user@host, user@host:port",
|
||||
"password": "Password",
|
||||
"passwordOptional": "Optional · leave empty when using a key",
|
||||
"connect": "Connect",
|
||||
"errorInvalidTarget": "Enter a host, e.g. root@192.168.1.10 or opsbase.cn:5555",
|
||||
"errorConnectFailed": "Connection failed"
|
||||
},
|
||||
"dialog": {
|
||||
"create": "New session",
|
||||
"edit": "Edit session",
|
||||
"subtitle": "One-line target · advanced options collapsed",
|
||||
"saving": "Saving…",
|
||||
"save": "Save",
|
||||
"createAndSave": "Create and save",
|
||||
"basic": "Basic",
|
||||
"login": "Sign-in",
|
||||
"advanced": "Advanced",
|
||||
"advancedCollapsed": "Proxy · jump host · tags",
|
||||
"collapse": "Collapse",
|
||||
"protocol": "Protocol",
|
||||
"displayName": "Display name (optional)",
|
||||
"displayNamePlaceholder": "Defaults to user@host or vnc:host",
|
||||
"host": "Host",
|
||||
"hostPlaceholder": "192.168.1.10",
|
||||
"hostHint": "IP or hostname; host:port is also accepted",
|
||||
"port": "Port",
|
||||
"username": "Username",
|
||||
"usernamePlaceholderRdp": "Administrator",
|
||||
"usernamePlaceholderSsh": "root",
|
||||
"width": "Width",
|
||||
"height": "Height",
|
||||
"group": "Group",
|
||||
"authPassword": "Password",
|
||||
"authKey": "Key",
|
||||
"password": "Password",
|
||||
"domain": "Domain (optional)",
|
||||
"domainPlaceholder": "Rarely needed unless using a domain account",
|
||||
"keySource": "Key source",
|
||||
"keyFile": "File",
|
||||
"keyText": "Text",
|
||||
"privateKeyPath": "Private key path",
|
||||
"privateKeyText": "Private key text",
|
||||
"privateKeyTextHint": "Pasted keys are encrypted on disk like passwords",
|
||||
"pickKeyFile": "Browse…",
|
||||
"pickKeyDialogTitle": "Choose private key file",
|
||||
"allFilesFilter": "All files",
|
||||
"passphrase": "Key passphrase (optional)",
|
||||
"passphrasePlaceholder": "Optional",
|
||||
"tags": "Tags",
|
||||
"tagsPlaceholder": "prod, web",
|
||||
"startupCommand": "Startup command (optional)",
|
||||
"startupCommandPlaceholder": "Run after connect, e.g. cd /var/log",
|
||||
"proxy": "Proxy",
|
||||
"proxyNone": "None",
|
||||
"proxyHostPlaceholder": "Proxy host",
|
||||
"proxyPortPlaceholder": "Port",
|
||||
"proxyUserPlaceholder": "Username (optional)",
|
||||
"proxyPasswordPlaceholder": "Password (optional)",
|
||||
"jumpHost": "Jump host (optional)",
|
||||
"jumpNone": "No jump host",
|
||||
"jumpNoneAlt": "No jump host",
|
||||
"jumpHint": "One saved session can be used as a jump host"
|
||||
},
|
||||
"batch": {
|
||||
"title": "Batch exec",
|
||||
"subtitle": "{{selected}} selected · concurrency {{concurrency}} · results discarded when tab closes",
|
||||
"dialogTitle": "Batch command",
|
||||
"dialogDesc": "{{selected}}/{{total}} hosts selected · max concurrency {{concurrency}}",
|
||||
"targetCount": "{{count}} targets",
|
||||
"runningProgress": "Running {{completed}}/{{total}}",
|
||||
"execute": "Run on {{count}} hosts",
|
||||
"executeAgain": "Run again",
|
||||
"success": "{{count}} succeeded",
|
||||
"failed": "{{count}} failed",
|
||||
"command": "Remote command",
|
||||
"commandPlaceholder": "e.g. uptime",
|
||||
"targets": "Target hosts",
|
||||
"filterPlaceholder": "Name, IP, group, or tag",
|
||||
"filterAria": "Filter hosts",
|
||||
"noMatchHosts": "No matching hosts",
|
||||
"resultMatrix": "Result matrix",
|
||||
"resultMatrixHint": "Host × status × output",
|
||||
"emptySelection": "Pick targets on the left, or open from sidebar batch mode with a selection",
|
||||
"noOutput": "(no output)",
|
||||
"errorReadConfig": "Could not read session config",
|
||||
"errorConnectFailed": "Connection failed",
|
||||
"errorExecFailed": "Command execution failed",
|
||||
"results": "Results",
|
||||
"resultsHint": "Output is kept only in this dialog",
|
||||
"ctrlEnterHint": "Ctrl/⌘ + Enter to run",
|
||||
"executeTo": "Run on {{count}} hosts",
|
||||
"selectFromLeft": "Select targets on the left"
|
||||
},
|
||||
"importExport": {
|
||||
"exportTitle": "Export sessions",
|
||||
"exportDefaultPath": "opsxshell-sessions.bak",
|
||||
"exportFilterBak": "OpsXShell backup",
|
||||
"exportFilterJson": "JSON",
|
||||
"exportSuccess": "Exported {{count}} sessions to:\n{{path}}",
|
||||
"exportWriteFailed": "Failed to write export file",
|
||||
"exportFailed": "Session export failed",
|
||||
"exportFailedDetail": "Session export failed: {{message}}",
|
||||
"exportPasswordTitle": "Set backup password",
|
||||
"exportPasswordMessage": "The export file will encrypt host groups, private keys, passwords, and other secrets. Choose a backup password.",
|
||||
"exportPasswordPlaceholder": "Enter backup password",
|
||||
"exportPasswordConfirmTitle": "Confirm backup password",
|
||||
"exportPasswordConfirmMessage": "Enter the backup password again to confirm.",
|
||||
"exportPasswordConfirmPlaceholder": "Re-enter backup password",
|
||||
"exportPasswordMismatch": "Passwords do not match",
|
||||
"exportPasswordRequired": "A backup password is required to export",
|
||||
"importTitle": "Import sessions",
|
||||
"importFilterBak": "OpsXShell backup",
|
||||
"importFilterJson": "JSON",
|
||||
"importFilterSshConfig": "SSH Config",
|
||||
"importFilterAll": "All files",
|
||||
"readFileFailed": "Failed to read file",
|
||||
"readFileFailedDetail": "Failed to read file: {{message}}",
|
||||
"importPasswordTitle": "Enter backup password",
|
||||
"importPasswordMessage": "This file is encrypted. Enter the password set at export to import host groups and credentials.",
|
||||
"importPasswordPlaceholder": "Enter backup password",
|
||||
"importPasswordRequired": "A password is required to import an encrypted backup",
|
||||
"importPasswordInvalid": "Incorrect backup password, or the file is corrupted",
|
||||
"noSessionsFound": "No importable sessions found",
|
||||
"noValidSessions": "No valid session entries in the file",
|
||||
"importSuccess": "Imported {{created}}/{{total}} sessions",
|
||||
"importFailed": "Session import failed",
|
||||
"importFailedDetail": "Session import failed: {{message}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"nav": {
|
||||
"general": "Workspace",
|
||||
"generalDesc": "Layout and resources",
|
||||
"appearance": "Appearance",
|
||||
"appearanceDesc": "Theme and language",
|
||||
"terminal": "Terminal",
|
||||
"terminalDesc": "Font and colors",
|
||||
"shortcuts": "Shortcuts",
|
||||
"shortcutsDesc": "Key bindings",
|
||||
"ssh": "SSH",
|
||||
"sshDesc": "Connection and pool",
|
||||
"security": "Security",
|
||||
"securityDesc": "Credentials and host keys",
|
||||
"ai": "AI models",
|
||||
"aiDesc": "AI providers",
|
||||
"about": "About",
|
||||
"aboutDesc": "Version and data"
|
||||
},
|
||||
"title": "Settings",
|
||||
"search": {
|
||||
"placeholder": "Search settings..."
|
||||
},
|
||||
"language": {
|
||||
"label": "Language",
|
||||
"description": "Applies immediately",
|
||||
"zhCN": "简体中文",
|
||||
"zhTW": "繁體中文",
|
||||
"en": "English",
|
||||
"ja": "日本語",
|
||||
"ko": "한국어",
|
||||
"vi": "Tiếng Việt",
|
||||
"ru": "Русский"
|
||||
},
|
||||
"general": {
|
||||
"layout": "Workspace layout",
|
||||
"sidebarWidth": "Sidebar width",
|
||||
"sidebarWidthDesc": "Default width of the session sidebar",
|
||||
"collapseSidebar": "Collapse sidebar",
|
||||
"collapseSidebarDesc": "Hide the session tree to focus on the terminal; toggle with Ctrl/Cmd+B"
|
||||
},
|
||||
"appearance": {
|
||||
"themeGroup": "Theme",
|
||||
"theme": "Theme",
|
||||
"themeDesc": "App UI colors (independent of terminal colors)",
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System"
|
||||
},
|
||||
"terminal": {
|
||||
"fontGroup": "Font and size",
|
||||
"fontFamily": "Font",
|
||||
"fontFamilyDesc": "Use a Nerd Font for Zsh prompt icons",
|
||||
"fontSize": "Size",
|
||||
"fontSizeDesc": "Terminal text size",
|
||||
"scrollback": "Scrollback",
|
||||
"scrollbackDesc": "Lines of history kept per terminal",
|
||||
"keywordHighlight": "Keyword highlight",
|
||||
"keywordHighlightDesc": "Highlight errors, warnings, and success states",
|
||||
"colorTheme": "Color theme"
|
||||
},
|
||||
"shortcuts": {
|
||||
"resetAll": "Reset all to defaults",
|
||||
"custom": "Custom",
|
||||
"pressKeys": "Press keys...",
|
||||
"resetDefault": "Reset to default",
|
||||
"conflict": "Conflicts with \"{{label}}\"",
|
||||
"setTo": "Set to {{keys}}",
|
||||
"hint": "Click a shortcut to rebind · Esc to cancel",
|
||||
"category": {
|
||||
"tabs": "Tabs",
|
||||
"view": "View",
|
||||
"session": "Session",
|
||||
"tools": "Tools"
|
||||
},
|
||||
"actions": {
|
||||
"tabNext": "Next tab",
|
||||
"tabPrev": "Previous tab",
|
||||
"tabGotoN": "Go to tab N",
|
||||
"tabClose": "Close current tab",
|
||||
"tabNew": "New tab",
|
||||
"viewFullscreen": "Toggle fullscreen",
|
||||
"viewToggleSidebar": "Toggle sidebar",
|
||||
"sessionNew": "New session",
|
||||
"sessionQuickConnect": "Quick connect",
|
||||
"toolsCommandPalette": "Command palette"
|
||||
}
|
||||
},
|
||||
"ssh": {
|
||||
"connection": "Connection",
|
||||
"keepAlive": "Keep-alive",
|
||||
"keepAliveDesc": "Send keep-alive when idle to reduce disconnects",
|
||||
"autoReconnect": "Auto reconnect",
|
||||
"autoReconnectDesc": "Automatically retry after unexpected disconnects",
|
||||
"timeout": "Connection timeout",
|
||||
"timeoutDesc": "Maximum wait time when establishing SSH (seconds)",
|
||||
"maxReconnect": "Reconnect attempts",
|
||||
"maxReconnectDesc": "Maximum retries after unexpected disconnect",
|
||||
"pool": "Connection pool",
|
||||
"maxConnections": "Max connections",
|
||||
"maxConnectionsDesc": "Shared cap for SSH, SFTP, and batch connections",
|
||||
"maxBackground": "Background connection limit",
|
||||
"maxBackgroundDesc": "Evict least recently used connections when over limit",
|
||||
"suspend": "Background suspend",
|
||||
"suspendDesc": "Minutes before releasing active channels when a tab is in background"
|
||||
},
|
||||
"security": {
|
||||
"credentials": "Credential protection",
|
||||
"sessionPassword": "Session passwords and key passphrases",
|
||||
"sessionPasswordDesc": "Encrypted with AES-256-GCM in Rust before save; cannot be disabled",
|
||||
"enabled": "Enabled",
|
||||
"masterKey": "Local master key",
|
||||
"masterKeyDesc": "Readable only by the current system user; path ~/.opsxshell/master.key (legacy ~/.opsxshsell is migrated automatically)",
|
||||
"knownHosts": "Known hosts",
|
||||
"knownHostsHint": "First connect prompts for the host fingerprint. If a reinstall or clone changes the key, choose “Trust and update” in the prompt to replace the old record. Remove one entry or clear all here.",
|
||||
"clearAll": "Clear all",
|
||||
"removeHost": "Remove this host record",
|
||||
"empty": "No records",
|
||||
"clearConfirm": "Clear all known host keys? You will be prompted again on next connect."
|
||||
},
|
||||
"about": {
|
||||
"tagline": "A lightweight native SSH / SFTP ops terminal",
|
||||
"appVersion": "App v{{version}}",
|
||||
"copyVersion": "Copy version info",
|
||||
"runtime": "Runtime",
|
||||
"system": "System",
|
||||
"localData": "Local data",
|
||||
"sessionsSettings": "Sessions and settings",
|
||||
"masterKeyPath": "Master key",
|
||||
"privacyNote": "Passwords and key passphrases are encrypted with AES-256-GCM in Rust. OpsXShell does not save terminal command history.",
|
||||
"license": "MIT License · Rust · XTerm.js"
|
||||
},
|
||||
"ai": {
|
||||
"presets": "Provider presets",
|
||||
"add": "Add",
|
||||
"configured": "Configured",
|
||||
"configuredHint": "Choose a provider and click Add",
|
||||
"emptyHint": "Add a provider to get started",
|
||||
"noModel": "No model selected",
|
||||
"name": "Name",
|
||||
"model": "Model",
|
||||
"protocol": "Protocol",
|
||||
"auth": "Auth",
|
||||
"authNone": "None",
|
||||
"test": "Test",
|
||||
"testing": "Testing",
|
||||
"testingMessage": "Testing...",
|
||||
"saved": "Saved",
|
||||
"retest": "Please re-test",
|
||||
"testFailed": "Connection test failed",
|
||||
"available": "OK · {{latency}} ms",
|
||||
"savedKeepBlank": "Saved — leave blank to keep",
|
||||
"notRequired": "Not required",
|
||||
"otherModels": "Other models…",
|
||||
"customModel": "Custom model",
|
||||
"backToList": "Back to list",
|
||||
"apiKeyOptional": "API Key (not required)",
|
||||
"advanced": "Advanced",
|
||||
"allowHttp": "Allow HTTP (localhost/LAN)",
|
||||
"setActive": "Set as active",
|
||||
"deleteTitle": "Delete",
|
||||
"apiKeySaveFailed": "Failed to save API key",
|
||||
"providerNotFound": "Provider not found",
|
||||
"modelCatalogReadFailed": "Failed to read model catalog",
|
||||
"catalogUnavailable": "models.dev is unavailable"
|
||||
},
|
||||
"family": {
|
||||
"openai_compatible": "OpenAI compatible",
|
||||
"standalone": "────────",
|
||||
"plan": "Plan",
|
||||
"local": "Self-hosted",
|
||||
"custom": "Custom"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"panel": {
|
||||
"local": "Local",
|
||||
"remote": "Remote",
|
||||
"notConnectedTitle": "Not connected to remote server",
|
||||
"notConnectedDesc": "Connect an SSH session first to use SFTP",
|
||||
"ariaLabel": "{{title}} file panel"
|
||||
},
|
||||
"connection": {
|
||||
"selectServer": "Select server",
|
||||
"noSessions": "No saved sessions",
|
||||
"createSessionHint": "Create a session in the sidebar first",
|
||||
"reconnect": "Reconnect",
|
||||
"notConnected": "Not connected",
|
||||
"connecting": "Connecting..."
|
||||
},
|
||||
"errors": {
|
||||
"notConnected": "SFTP is not connected",
|
||||
"noUploadFiles": "No files to upload",
|
||||
"localStatFailed": "Could not read local file info",
|
||||
"loadRemoteFailed": "Failed to load remote directory: {{message}}",
|
||||
"noFolderDownload": "Failed to download folder",
|
||||
"selectDownloadFiles": "Select files to download first",
|
||||
"uploadFailed": "Upload failed",
|
||||
"downloadFailed": "Download failed",
|
||||
"fileError": "{{fileName}}: {{message}}"
|
||||
},
|
||||
"toolbar": {
|
||||
"upload": "Upload",
|
||||
"uploadAria": "Upload",
|
||||
"download": "Download",
|
||||
"downloadAria": "Download",
|
||||
"downloadNeedSelection": "Select remote files first",
|
||||
"downloadHint": "Download selected remote files",
|
||||
"refresh": "Refresh",
|
||||
"refreshAria": "Refresh",
|
||||
"newFolder": "New folder",
|
||||
"newFolderAria": "New folder"
|
||||
},
|
||||
"sort": {
|
||||
"name": "Name",
|
||||
"modified": "Modified",
|
||||
"size": "Size",
|
||||
"type": "Type"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Home",
|
||||
"back": "Back",
|
||||
"forward": "Forward",
|
||||
"up": "Up",
|
||||
"searchPlaceholder": "Search filenames",
|
||||
"clearSearch": "Clear search",
|
||||
"clearSearchAria": "Clear search",
|
||||
"showHidden": "Show hidden files",
|
||||
"hideHidden": "Hide dotfiles (.xxx)",
|
||||
"showHiddenAria": "Show hidden files",
|
||||
"hideHiddenAria": "Hide dotfiles",
|
||||
"searchAria": "Search in {{title}}"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Loading...",
|
||||
"selected": "{{count}} selected",
|
||||
"filtered": "Showing {{shown}} / {{total}}",
|
||||
"hiddenCount": "{{total}} items ({{hidden}} hidden)",
|
||||
"total": "{{count}} items",
|
||||
"filterHint": "Filter: {{query}}"
|
||||
},
|
||||
"empty": {
|
||||
"dirTitle": "Empty directory",
|
||||
"dirDescLocal": "No files in this directory",
|
||||
"dirDescRemote": "Try going up or refreshing",
|
||||
"goUp": "Go up",
|
||||
"hiddenOnlyTitle": "Hidden files only",
|
||||
"hiddenOnlyDesc": "Click the eye icon in the header to show dotfiles",
|
||||
"showHiddenAction": "Show hidden files",
|
||||
"noMatchTitle": "No matching files",
|
||||
"noMatchDesc": "No files matching \"{{query}}\""
|
||||
},
|
||||
"fileType": {
|
||||
"folder": "Folder",
|
||||
"symlink": "Link",
|
||||
"symlinkLong": "Symbolic link",
|
||||
"file": "File",
|
||||
"text": "Text",
|
||||
"log": "Log",
|
||||
"database": "Database",
|
||||
"imageIso": "Disk image",
|
||||
"executable": "Executable",
|
||||
"library": "Library"
|
||||
},
|
||||
"relativeDate": {
|
||||
"today": "Today",
|
||||
"yesterday": "Yesterday",
|
||||
"daysAgo": "{{count}} days ago"
|
||||
},
|
||||
"contextMenu": {
|
||||
"open": "Open",
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"edit": "Edit",
|
||||
"rename": "Rename",
|
||||
"copyPath": "Copy path",
|
||||
"properties": "Properties",
|
||||
"permissions": "Permissions",
|
||||
"delete": "Delete"
|
||||
},
|
||||
"dialog": {
|
||||
"renameTitle": "Rename",
|
||||
"renameMessage": "Enter a new name:",
|
||||
"renamePlaceholder": "New name",
|
||||
"newFolderTitle": "New folder",
|
||||
"newFolderMessage": "Enter folder name:",
|
||||
"newFolderPlaceholder": "Folder name",
|
||||
"propertiesTitle": "File properties",
|
||||
"propertiesClose": "Close",
|
||||
"chmodTitle": "Edit permissions",
|
||||
"chmodApply": "Apply",
|
||||
"pickUploadTitle": "Choose files or folders to upload",
|
||||
"pickUploadRzTitle": "Choose file to upload (rz)"
|
||||
},
|
||||
"properties": {
|
||||
"name": "Name",
|
||||
"path": "Path",
|
||||
"size": "Size",
|
||||
"permissions": "Permissions",
|
||||
"modified": "Modified",
|
||||
"accessed": "Accessed",
|
||||
"symlink": "Symbolic link",
|
||||
"loadingDetails": "Loading details..."
|
||||
},
|
||||
"chmod": {
|
||||
"read": "Read",
|
||||
"write": "Write",
|
||||
"execute": "Execute",
|
||||
"owner": "Owner",
|
||||
"group": "Group",
|
||||
"other": "Others",
|
||||
"current": "Current mode:",
|
||||
"readR": "Read (r)",
|
||||
"writeW": "Write (w)",
|
||||
"executeX": "Execute (x)"
|
||||
},
|
||||
"transfer": {
|
||||
"queue": "Transfer queue",
|
||||
"active": "{{count}} active",
|
||||
"completed": "{{count}} completed",
|
||||
"taskCount": "{{count}} tasks",
|
||||
"empty": "No transfer tasks",
|
||||
"cancel": "Cancel",
|
||||
"remove": "Remove",
|
||||
"statusWaiting": "Waiting",
|
||||
"statusDone": "Done",
|
||||
"statusFailed": "Failed",
|
||||
"statusCancelled": "Cancelled",
|
||||
"dropUpload": "Upload to {{path}}",
|
||||
"dropDownload": "Download to {{path}}"
|
||||
},
|
||||
"editor": {
|
||||
"readFailed": "Read failed",
|
||||
"saveFailed": "Save failed",
|
||||
"unsavedClose": "Unsaved changes. Close anyway?",
|
||||
"saving": "Saving...",
|
||||
"save": "Save",
|
||||
"saved": "File saved",
|
||||
"loadingEditor": "Loading editor...",
|
||||
"footer": "UTF-8 · Monaco · ⌘/Ctrl+S save · ~2MB max",
|
||||
"charCount": "{{count}} characters",
|
||||
"unsavedMark": " · unsaved",
|
||||
"savedMark": " · saved"
|
||||
},
|
||||
"toast": {
|
||||
"renamed": "Renamed to {{name}}",
|
||||
"renameFailed": "Rename failed",
|
||||
"pathCopied": "Path copied to clipboard",
|
||||
"pathCopyFailed": "Failed to copy path",
|
||||
"chmodUpdated": "Permissions updated to {{mode}}",
|
||||
"chmodFailed": "Failed to update permissions",
|
||||
"uploadPartial": "{{action}} finished {{completed}}, failed {{failed}}: {{detail}}",
|
||||
"uploadSuccess": "{{action}} completed for {{completed}} item(s)",
|
||||
"uploadAction": "Upload",
|
||||
"downloadAction": "Download",
|
||||
"noFolderUpload": "Folder upload failed",
|
||||
"noDragPath": "Drag-and-drop paths are unavailable; use Upload",
|
||||
"noFolderRecursive": "Recursive folder transfer failed; retry or use Upload"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "Command snippets"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Search snippets..."
|
||||
},
|
||||
"form": {
|
||||
"name": "Name",
|
||||
"command": "Command",
|
||||
"tags": "Tags",
|
||||
"tagsHint": "(comma-separated)",
|
||||
"namePlaceholder": "e.g. Restart Nginx",
|
||||
"commandPlaceholder": "sudo systemctl restart nginx\n# supports {{host}} {{username}} {{date}}",
|
||||
"variables": "Variables:"
|
||||
},
|
||||
"dialog": {
|
||||
"createTitle": "New snippet",
|
||||
"editTitle": "Edit snippet"
|
||||
},
|
||||
"empty": {
|
||||
"noMatch": "No matching snippets",
|
||||
"noMatchDesc": "Try a different keyword",
|
||||
"noSnippets": "No snippets yet",
|
||||
"noSnippetsDesc": "Save common commands and insert them into the terminal"
|
||||
},
|
||||
"action": {
|
||||
"create": "New snippet",
|
||||
"insert": "Insert into terminal",
|
||||
"noTerminal": "No active terminal"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"toolbar": {
|
||||
"splitHorizontal": "Split left/right",
|
||||
"splitVertical": "Split top/bottom",
|
||||
"addPane": "Add pane",
|
||||
"closePane": "Close current pane",
|
||||
"maximizePane": "Maximize current pane",
|
||||
"restoreLayout": "Restore split layout",
|
||||
"broadcast": "Broadcast",
|
||||
"broadcastAria": "Broadcast input",
|
||||
"broadcastOn": "Broadcast on: input syncs to {{count}} terminals in scope",
|
||||
"broadcastOffPro": "Broadcast input (Pro) · {{count}} terminals in scope",
|
||||
"broadcastNeedPanesTab": "This tab needs at least 2 ready panes to broadcast (split first)",
|
||||
"broadcastNeedPanesAll": "All terminal tabs need at least 2 ready terminals to broadcast",
|
||||
"broadcastScopeAria": "Broadcast scope",
|
||||
"broadcastScopeTab": "Current tab panes",
|
||||
"broadcastScopeAll": "All terminal tabs",
|
||||
"broadcastActive": "Broadcasting · {{count}}",
|
||||
"aiAssistant": "AI assistant",
|
||||
"aiOpen": "Open terminal AI assistant",
|
||||
"aiClose": "Close terminal AI assistant",
|
||||
"aiTitle": "Terminal AI assistant (Pro)",
|
||||
"paneCount": "{{current}}/{{max}}",
|
||||
"labelLocal": "Local terminal",
|
||||
"labelSsh": "SSH terminal",
|
||||
"closePaneLabel": "Close current pane",
|
||||
"closeTabLabel": "Close current terminal tab",
|
||||
"targetSshSession": "Current SSH session"
|
||||
},
|
||||
"overlay": {
|
||||
"shellClosedIdle": "Idle timeout; shell exited",
|
||||
"shellClosed": "Shell exited",
|
||||
"shellClosedHint": "SSH connection remains; other panes, SFTP, and tunnels are unaffected",
|
||||
"reopenShell": "Reopen shell",
|
||||
"reopening": "Opening…",
|
||||
"disconnected": "Disconnected",
|
||||
"disconnectedHint": "The SSH session ended or the network dropped. Click below to reconnect.",
|
||||
"reconnect": "Reconnect",
|
||||
"suspended": "Connection suspended",
|
||||
"suspendedHint": "Inactive for a while; connection was suspended to save resources",
|
||||
"resume": "Resume connection",
|
||||
"connectFailed": "Connection failed",
|
||||
"connectFailedHint": "Check host, port, username, and authentication",
|
||||
"retryConnect": "Retry connection",
|
||||
"connecting": "Connecting…",
|
||||
"reconnecting": "Auto-reconnecting{{attempt}}…",
|
||||
"reconnectingAttempt": " ({{count}})",
|
||||
"localShellExited": "Local shell exited"
|
||||
},
|
||||
"hostKey": {
|
||||
"titleNew": "Verify host key",
|
||||
"titleChanged": "Host key changed",
|
||||
"descNew": "First connection to this host. Verify the fingerprint before trusting.",
|
||||
"descChanged": "This host's SSH key no longer matches local records. Possible MITM risk.",
|
||||
"host": "Host",
|
||||
"type": "Type",
|
||||
"fingerprint": "SHA256 fingerprint",
|
||||
"previousFingerprint": "Previous fingerprint",
|
||||
"reject": "Reject",
|
||||
"acceptOnce": "Trust once",
|
||||
"acceptAlways": "Always trust",
|
||||
"acceptAlwaysChanged": "Trust and update anyway"
|
||||
},
|
||||
"contextMenu": {
|
||||
"aria": "Terminal actions",
|
||||
"copy": "Copy",
|
||||
"paste": "Paste",
|
||||
"selectAll": "Select all",
|
||||
"clear": "Clear screen",
|
||||
"splitRight": "Split right",
|
||||
"splitDown": "Split down",
|
||||
"maximizePane": "Maximize current pane",
|
||||
"restoreLayout": "Restore split layout"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Search...",
|
||||
"previous": "Previous (Shift+Enter)",
|
||||
"next": "Next (Enter)",
|
||||
"close": "Close (Escape)"
|
||||
},
|
||||
"zmodem": {
|
||||
"uploadTransferring": "rz upload: {{detail}}",
|
||||
"downloadTransferring": "sz download: {{detail}}",
|
||||
"selectLocalFile": "Choose local file",
|
||||
"pickUploadTitle": "Choose file to upload (rz)",
|
||||
"uploadedCount": "Uploaded {{count}} file(s)",
|
||||
"downloadedSingle": "{{path}}",
|
||||
"downloadedCount": "Downloaded {{count}} file(s) → {{dir}}",
|
||||
"transferDone": "Transfer finished",
|
||||
"transferFailed": "Transfer failed {{message}}",
|
||||
"uploadSuccessTerminal": "✓ Uploaded {{count}} file(s) to the remote working directory",
|
||||
"downloadSuccessTerminal": "✓ Downloaded {{path}}",
|
||||
"savedDownloadsSingle": "✓ Saved to Downloads",
|
||||
"savedDownloadsMultiple": "✓ Saved {{count}} file(s) to Downloads",
|
||||
"nativeApiUnavailable": "Native API unavailable",
|
||||
"readFailed": "Read failed: {{name}}",
|
||||
"writeFailed": "Write failed: {{name}}",
|
||||
"createLocalShellFailed": "Failed to create local shell",
|
||||
"createRemoteShellFailed": "Failed to create remote shell",
|
||||
"createShellFailed": "Failed to create shell: {{error}}"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Failed to read clipboard",
|
||||
"writeFailed": "Failed to write clipboard"
|
||||
},
|
||||
"input": {
|
||||
"failed": "Terminal input failed"
|
||||
},
|
||||
"connection": {
|
||||
"errorPrefix": "Error: {{message}}",
|
||||
"autoReconnecting": "Auto-reconnecting ({{attempt}})...",
|
||||
"autoReconnectLimit": "Auto-reconnect limit reached ({{max}}){{reasonSuffix}}",
|
||||
"autoReconnectLimitReason": " — {{reason}}",
|
||||
"disconnectedRetry": "Disconnected, retry {{attempt}}/{{max}} in {{seconds}}s...",
|
||||
"autoReconnectBanner": "[Auto-reconnect] Retrying {{attempt}}/{{max}} in {{seconds}}s",
|
||||
"disconnectedBanner": "[Disconnected] {{reason}}",
|
||||
"noConfig": "No connection details available"
|
||||
}
|
||||
}
|
||||
@@ -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": "高リスクは確認が必要 · クリティカルはブロック · セッションは保存されません"
|
||||
},
|
||||
"safety": {
|
||||
"aria": "エージェントの安全モード",
|
||||
"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": "拒否",
|
||||
"once": "1 回のみ",
|
||||
"always": "常に",
|
||||
"hint": "Enter · 1 回のみ Esc · 拒否 常に · このセッションで同種の確認をスキップ"
|
||||
},
|
||||
"error": {
|
||||
"noProvider": "先に「設定 → AI」で AI プロバイダーを設定してください",
|
||||
"noApiKey": "「{{provider}}」に保存された API キーはありません",
|
||||
"emptyTask": "タスクまたはフォローアップを入力してください",
|
||||
"sshRequired": "接続済みのリモート SSH セッションが必要です",
|
||||
"modelEmpty": "モデルがコンテンツを返しませんでした",
|
||||
"protocolFailed": "モデルがツールプロトコルに 2 回失敗しました · 停止",
|
||||
"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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,335 @@
|
||||
{
|
||||
"action": {
|
||||
"confirm": "確認",
|
||||
"cancel": "キャンセル",
|
||||
"close": "閉じる",
|
||||
"delete": "削除",
|
||||
"save": "保存",
|
||||
"create": "作成",
|
||||
"copy": "コピー",
|
||||
"copied": "コピーしました",
|
||||
"refresh": "更新",
|
||||
"gotIt": "了解",
|
||||
"edit": "編集",
|
||||
"open": "開く",
|
||||
"clone": "複製",
|
||||
"reconnect": "再接続",
|
||||
"disconnect": "切断",
|
||||
"submit": "OK"
|
||||
},
|
||||
"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": "ローカルシェルを開く",
|
||||
"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": "デフォルトのローカルシェルを開く",
|
||||
"choose": "シェルを選択",
|
||||
"title": "ローカルシェル",
|
||||
"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": "Pro 機能",
|
||||
"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": "1 回限りの購入 · このデバイスで永久利用 · サブスクなし",
|
||||
"pasteLicense": "ライセンスを貼り付け",
|
||||
"activateButton": "アクティベート",
|
||||
"clearLicense": "ローカルライセンスを削除",
|
||||
"paymentNote": "決済は Waffo が処理します。本アプリはカード情報を収集しません。",
|
||||
"testDeviceId": "テスト環境 · デバイス ID: {{deviceId}}",
|
||||
"later": "後で",
|
||||
"viewPro": "Pro を見る",
|
||||
"wallComingSoonSuffix": " · 近日公開",
|
||||
"wallUnlock": "{{feature}} のロックを解除",
|
||||
"wallMessageComingSoon": "この Pro 機能はまだ開発中です。アップグレードで早期アクセス。",
|
||||
"wallMessageDefault": "この機能には OpsXShell Pro が必要です。このデバイスで利用するにはアップグレードしてください。",
|
||||
"checkoutUnavailable": "チェックアウト不可 ({{status}})",
|
||||
"freeTier": "無料",
|
||||
"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": "セッション、ローカルシェル、デバイスコンソール",
|
||||
"cards": {
|
||||
"quickConnect": {
|
||||
"title": "クイック接続",
|
||||
"desc": "user@host:port"
|
||||
},
|
||||
"saveSession": {
|
||||
"title": "セッションを保存",
|
||||
"desc": "認証情報、グループ、プロキシ"
|
||||
},
|
||||
"serial": {
|
||||
"title": "シリアルターミナル",
|
||||
"desc": "ボーレートとポート設定"
|
||||
}
|
||||
},
|
||||
"sectionLocalShell": "ローカルシェル",
|
||||
"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 を開始するか、Local / Remote ルールを追加",
|
||||
"emptyAction": "127.0.0.1:1080 を開始",
|
||||
"typeLocal": "Local",
|
||||
"typeRemote": "Remote",
|
||||
"typeDynamic": "Dynamic",
|
||||
"running": "実行中",
|
||||
"socksProxy": "SOCKS5: 127.0.0.1:{{port}}",
|
||||
"remoteToLocal": "リモート {{remote}} → ローカル {{local}}",
|
||||
"stats": "{{connections}} 接続 · ↑{{up}} · ↓{{down}}",
|
||||
"copyProxy": "プロキシをコピー",
|
||||
"copyRule": "ルールを複製",
|
||||
"editRule": "編集",
|
||||
"stopListener": "停止",
|
||||
"start": "開始",
|
||||
"delete": "削除",
|
||||
"editTitle": "転送を編集",
|
||||
"addTitle": "転送を追加",
|
||||
"typeLocalDesc": "Local → リモート",
|
||||
"typeRemoteDesc": "リモート → Local",
|
||||
"typeDynamicDesc": "SOCKS5",
|
||||
"selectType": "タイプ",
|
||||
"drawerSubtitle": "現在の SSH セッション経由でトンネル",
|
||||
"ruleFields": "詳細",
|
||||
"dynamicHint": "127.0.0.1:1080 のローカル SOCKS5。トラフィックはこの SSH サーバーのパブリック IP から出ていきます。",
|
||||
"dynamicSingleHint": "SSH ホストごとに 1 つの Dynamic ルール、固定ポート 1080。",
|
||||
"dynamicPortHint": "If the port is busy, pick another local port (e.g. 1081).",
|
||||
"ruleList": "ルール",
|
||||
"ruleListEmpty": "Local / Remote ルールはまだありません",
|
||||
"addSection": "新規追加",
|
||||
"errorDynamicExists": "Dynamic は既に存在します (1080)。開始または停止してください。",
|
||||
"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": "Local: リモートポートをローカルにあるかのように利用できます。",
|
||||
"remoteCaption": "Remote: リモートからのアクセスをローカルサービスに転送します。",
|
||||
"dynamicCaption": "Dynamic: このマシンが SOCKS5 プロキシとなり、現在の SSH サーバーのパブリック IP から出ていきます。"
|
||||
},
|
||||
"ruleName": "名前",
|
||||
"ruleNamePlaceholder": "例: MySQL",
|
||||
"localListenPort": "ローカルリッスンポート",
|
||||
"localTargetPort": "ローカルターゲットポート",
|
||||
"remoteTargetPort": "リモートターゲットポート",
|
||||
"remoteListenPort": "リモートリッスンポート",
|
||||
"portPlaceholder": "例: 3306",
|
||||
"remoteHost": "リモートホスト",
|
||||
"remoteHostPlaceholder": "localhost または IP",
|
||||
"socksRuleName": "SOCKS5 プロキシ",
|
||||
"defaultLocalName": "Local 転送",
|
||||
"defaultRemoteName": "Remote 転送",
|
||||
"sessionRestoredTitle": "セッションを復元しました",
|
||||
"sessionRestoredDesc": "前回セッションのポート転送タブを復元しました。\n再び利用するには SSH を再接続してください。",
|
||||
"stopEditTitle": "編集前に停止",
|
||||
"stopEditMessage": "この転送は実行中です。編集前に停止しますか?",
|
||||
"stopEditConfirm": "停止して編集",
|
||||
"deleteTitle": "ルールを削除",
|
||||
"deleteRunning": "実行中の転送はまず停止されます。",
|
||||
"deleteConfirm": "このルールを削除しますか?",
|
||||
"errorNamePort": "名前と有効なポート (1–65535) を入力してください",
|
||||
"errorTargetPort": "有効なターゲットポート (1–65535) を入力してください",
|
||||
"errorRemoteHost": "リモートホストを入力してください",
|
||||
"errorNotConnected": "未接続",
|
||||
"errorStartFailed": "開始失敗",
|
||||
"errorStopFailed": "停止失敗",
|
||||
"errorSocksRunning": "SOCKS5 は既に実行中",
|
||||
"copySuffix": "コピー"
|
||||
}
|
||||
}
|
||||
@@ -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 · ハンドシェイクタイムアウト 45 秒。開発中は証明書の検証が緩和されています。",
|
||||
"vncFootnote": "ネイティブ vnc-rs RFB · Tight JPEG デコード · クリップボードは UTF-8 で送信 (非常に古いサーバーでは文字化けする場合があります)。",
|
||||
"errorHostRequired": "ホストアドレスを入力してください",
|
||||
"errorUsernameRequired": "ユーザー名を入力してください"
|
||||
},
|
||||
"toolbar": {
|
||||
"pasteClipboard": "ローカルのクリップボードをリモートに貼り付け",
|
||||
"pasteAria": "リモートに貼り付け",
|
||||
"shareDrive": "ローカルファイルを共有ドライブにコピー (OpsXShell ではローカルの Downloads = リモートの Downloads)",
|
||||
"shareDriveAria": "共有ドライブに追加",
|
||||
"openShareDir": "共有フォルダーをローカルで開く (Downloads)",
|
||||
"openShareDirAria": "共有フォルダーを開く",
|
||||
"disconnect": "切断",
|
||||
"disconnectAria": "切断"
|
||||
},
|
||||
"status": {
|
||||
"connecting": "接続中…",
|
||||
"connected": "接続済み",
|
||||
"disconnected": "切断済み",
|
||||
"connectFailed": "接続失敗",
|
||||
"clipboardSynced": "リモートのクリップボードを同期しました",
|
||||
"savedToDownloads": "ローカルの Downloads に保存: {{name}}",
|
||||
"pastedToRemote": "リモートに貼り付けました",
|
||||
"fileTooLarge": "1 ファイルの上限は 50MB です",
|
||||
"fileShared": "共有 Downloads に追加: {{name}} (リモートの This PC に表示)"
|
||||
}
|
||||
}
|
||||
@@ -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": "ローカルシェルの作成に失敗しました",
|
||||
"remoteCreateFailed": "リモートシェルの作成に失敗しました"
|
||||
},
|
||||
"proxy": {
|
||||
"connectFailed": "プロキシ接続に失敗しました",
|
||||
"authFailed": "プロキシ認証に失敗しました",
|
||||
"tunnelFailed": "プロキシトンネルの確立に失敗しました",
|
||||
"unsupported": "未対応のプロキシ形式です",
|
||||
"jumpFailed": "ジャンプホストへの接続に失敗しました",
|
||||
"hostRequired": "プロキシホストは必須です",
|
||||
"hostNoSpaces": "プロキシホストに空白を含めることはできません",
|
||||
"portRequired": "プロキシポートは 0 より大きい必要があります",
|
||||
"portTooHigh": "プロキシポートは 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": "1 ファイルの上限は 50MB です",
|
||||
"nativeOnly": "リモート接続は OpsXShell Tauri デスクトップアプリでのみ利用できます",
|
||||
"rdpNativeOnly": "RDP は OpsXShell Tauri デスクトップアプリでのみ利用できます",
|
||||
"vncNativeOnly": "VNC は OpsXShell Tauri デスクトップアプリでのみ利用できます"
|
||||
},
|
||||
"serial": {
|
||||
"openFailed": "シリアルポートを開けませんでした",
|
||||
"writeFailed": "シリアルへの書き込みに失敗しました",
|
||||
"nativeOnly": "シリアルポートは Tauri デスクトップアプリでのみ利用できます"
|
||||
},
|
||||
"ai": {
|
||||
"noProvider": "先に「設定 → AI」で AI プロバイダーを設定してください",
|
||||
"noApiKey": "「{{provider}}」に保存された API キーはありません",
|
||||
"modelEmpty": "モデルがコンテンツを返しませんでした",
|
||||
"protocolFailed": "モデルがツールプロトコルに 2 回失敗しました · 停止",
|
||||
"noConclusion": "モデルが利用可能な結論を返しませんでした",
|
||||
"multipleCommands": "モデルが複数のコマンドを返しました · 実行を拒否",
|
||||
"invalidCommand": "モデルが単一行のコマンドを返しませんでした · 実行を拒否",
|
||||
"repeatLoop": "繰り返しのコマンドループを検出 · 停止: {{command}}",
|
||||
"criticalBlocked": "コマンドが破壊的なハードブロックに該当 · 上書き不可: {{command}}",
|
||||
"execFailed": "ssh-exec 失敗: {{error}}",
|
||||
"maxSteps": "{{max}} ステップの上限に達しました · 範囲を絞って再試行してください",
|
||||
"sshRequired": "接続済みのリモート SSH セッションが必要です"
|
||||
},
|
||||
"zmodem": {
|
||||
"readFailed": "読み取り失敗: {{name}}",
|
||||
"writeFailed": "書き込み失敗: {{name}}"
|
||||
},
|
||||
"unknown": {
|
||||
"error": "不明なエラーが発生しました"
|
||||
}
|
||||
}
|
||||
@@ -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": " · ローカルエコー"
|
||||
}
|
||||
}
|
||||
@@ -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": "例: Production",
|
||||
"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": "ローカルシェル",
|
||||
"selectShell": "シェルを選択",
|
||||
"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": "1 行ターゲット · 詳細オプションは折りたたみ",
|
||||
"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": "prod, 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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"nav": {
|
||||
"general": "ワークスペース",
|
||||
"generalDesc": "レイアウトとリソース",
|
||||
"appearance": "外観",
|
||||
"appearanceDesc": "テーマと言語",
|
||||
"terminal": "ターミナル",
|
||||
"terminalDesc": "フォントと配色",
|
||||
"shortcuts": "ショートカット",
|
||||
"shortcutsDesc": "キーバインド",
|
||||
"ssh": "SSH",
|
||||
"sshDesc": "接続とプール",
|
||||
"security": "セキュリティ",
|
||||
"securityDesc": "資格情報とホストキー",
|
||||
"ai": "AI モデル",
|
||||
"aiDesc": "AI プロバイダー",
|
||||
"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": "アプリ UI の配色(ターミナル配色とは独立)",
|
||||
"dark": "ダーク",
|
||||
"light": "ライト",
|
||||
"system": "システムに合わせる"
|
||||
},
|
||||
"terminal": {
|
||||
"fontGroup": "フォントとサイズ",
|
||||
"fontFamily": "フォント",
|
||||
"fontFamilyDesc": "Zsh プロンプトのアイコン表示には Nerd Font が必要です",
|
||||
"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": "プロバイダーを追加して開始",
|
||||
"noModel": "モデル未選択",
|
||||
"name": "名前",
|
||||
"model": "モデル",
|
||||
"protocol": "プロトコル",
|
||||
"auth": "認証",
|
||||
"authNone": "なし",
|
||||
"test": "テスト",
|
||||
"testing": "テスト中",
|
||||
"testingMessage": "テスト中...",
|
||||
"saved": "保存済み",
|
||||
"retest": "再テストしてください",
|
||||
"testFailed": "接続テストに失敗しました",
|
||||
"available": "OK · {{latency}} ms",
|
||||
"savedKeepBlank": "保存済み — 空欄で維持",
|
||||
"notRequired": "不要",
|
||||
"otherModels": "その他のモデル…",
|
||||
"customModel": "カスタムモデル",
|
||||
"backToList": "一覧に戻る",
|
||||
"apiKeyOptional": "API Key(不要)",
|
||||
"advanced": "詳細",
|
||||
"allowHttp": "HTTP を許可(localhost / LAN)",
|
||||
"setActive": "現在のプロバイダーに設定",
|
||||
"deleteTitle": "削除",
|
||||
"apiKeySaveFailed": "API Key の保存に失敗しました",
|
||||
"providerNotFound": "プロバイダーが見つかりません",
|
||||
"modelCatalogReadFailed": "モデルカタログの読み取りに失敗しました",
|
||||
"catalogUnavailable": "models.dev を利用できません"
|
||||
},
|
||||
"family": {
|
||||
"openai_compatible": "OpenAI 互換",
|
||||
"standalone": "────────",
|
||||
"plan": "Plan",
|
||||
"local": "セルフホスト",
|
||||
"custom": "カスタム"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"panel": {
|
||||
"local": "ローカル",
|
||||
"remote": "リモート",
|
||||
"notConnectedTitle": "リモートサーバーに接続されていません",
|
||||
"notConnectedDesc": "SFTP を使用するにはまず SSH セッションを接続してください",
|
||||
"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": "{{completed}} 件のアイテムの {{action}} が完了",
|
||||
"uploadAction": "アップロード",
|
||||
"downloadAction": "ダウンロード",
|
||||
"noFolderUpload": "フォルダーのアップロードに失敗",
|
||||
"noDragPath": "ドラッグ&ドロップのパスは利用できません · アップロードを使用してください",
|
||||
"noFolderRecursive": "フォルダーの再帰転送に失敗 · 再試行するかアップロードを使用してください"
|
||||
}
|
||||
}
|
||||
@@ -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": "アクティブなターミナルがありません"
|
||||
}
|
||||
}
|
||||
@@ -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": "アイドルタイムアウト · シェルが終了しました",
|
||||
"shellClosed": "シェルが終了しました",
|
||||
"shellClosedHint": "SSH 接続は維持 · 他のペイン、SFTP、トンネルには影響しません",
|
||||
"reopenShell": "シェルを再開",
|
||||
"reopening": "開いています…",
|
||||
"disconnected": "切断されました",
|
||||
"disconnectedHint": "SSH セッションが終了したか、ネットワークが切断されました。下のボタンで再接続できます。",
|
||||
"reconnect": "再接続",
|
||||
"suspended": "接続が一時停止",
|
||||
"suspendedHint": "しばらく操作がなかったため、リソース節約のため接続を一時停止しました",
|
||||
"resume": "接続を再開",
|
||||
"connectFailed": "接続失敗",
|
||||
"connectFailedHint": "ホスト、ポート、ユーザー名、認証を確認してください",
|
||||
"retryConnect": "接続を再試行",
|
||||
"connecting": "接続中…",
|
||||
"reconnecting": "自動再接続中{{attempt}}…",
|
||||
"reconnectingAttempt": " ({{count}})",
|
||||
"localShellExited": "ローカルシェルが終了しました"
|
||||
},
|
||||
"hostKey": {
|
||||
"titleNew": "ホスト鍵を確認",
|
||||
"titleChanged": "ホスト鍵が変更されました",
|
||||
"descNew": "このホストへの初回接続です。信頼する前にフィンガープリントを確認してください。",
|
||||
"descChanged": "このホストの SSH 鍵がローカルの記録と一致しません。MITM のリスクの可能性があります。",
|
||||
"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": "ローカルシェルの作成に失敗",
|
||||
"createRemoteShellFailed": "リモートシェルの作成に失敗",
|
||||
"createShellFailed": "シェルの作成に失敗: {{error}}"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "クリップボードの読み取りに失敗",
|
||||
"writeFailed": "クリップボードへの書き込みに失敗"
|
||||
},
|
||||
"input": {
|
||||
"failed": "ターミナル入力に失敗"
|
||||
},
|
||||
"connection": {
|
||||
"errorPrefix": "エラー: {{message}}",
|
||||
"autoReconnecting": "自動再接続中 ({{attempt}})...",
|
||||
"autoReconnectLimit": "自動再接続の上限に達しました ({{max}}){{reasonSuffix}}",
|
||||
"autoReconnectLimitReason": " — {{reason}}",
|
||||
"disconnectedRetry": "切断しました · {{seconds}} 秒後に {{attempt}}/{{max}} を再試行...",
|
||||
"autoReconnectBanner": "[自動再接続] {{seconds}} 秒後に {{attempt}}/{{max}} を再試行",
|
||||
"disconnectedBanner": "[切断] {{reason}}",
|
||||
"noConfig": "接続情報がありません"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "에이전트 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": "고위험은 확인 필요 · 치명적 작업은 차단됨 · 세션 저장 안 함"
|
||||
},
|
||||
"safety": {
|
||||
"aria": "에이전트 안전 모드",
|
||||
"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": "거부",
|
||||
"once": "1회",
|
||||
"always": "항상",
|
||||
"hint": "Enter · 1회 Esc · 거부 항상 · 이 세션에서 유사한 확인 건너뛰기"
|
||||
},
|
||||
"error": {
|
||||
"noProvider": "먼저 설정 → AI에서 AI 제공자를 구성하세요",
|
||||
"noApiKey": "\"{{provider}}\"에 대해 저장된 API 키가 없습니다",
|
||||
"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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,335 @@
|
||||
{
|
||||
"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": "로컬 셸 열기",
|
||||
"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": "기본 로컬 셸 열기",
|
||||
"choose": "셸 선택",
|
||||
"title": "로컬 셸",
|
||||
"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": "Pro 기능",
|
||||
"unlock": "{{feature}} 잠금 해제",
|
||||
"comingSoon": "출시 예정",
|
||||
"activateSuccess": "활성화됨",
|
||||
"activateFailed": "활성화 실패",
|
||||
"licenseActivated": "Pro 라이선스가 활성화되었습니다",
|
||||
"paymentPending": "결제 후 라이선스를 여기에 붙여넣거나 나중에 다시 활성화해 보세요",
|
||||
"invalidLicense": "활성화 실패: 잘못된 라이선스",
|
||||
"goUpgrade": "업그레이드",
|
||||
"haveLicense": "라이선스가 있나요? 활성화",
|
||||
"title": "OpsXShell Pro · Pro 운영 기능 잠금 해제",
|
||||
"subtitleComingSoon": "{{feature}} 출시 예정 · 조기 액세스는 Pro 업그레이드",
|
||||
"subtitleUnlock": "잠금 해제 중: {{feature}}",
|
||||
"subtitleDefault": "포워딩, 프록시, 시리얼, AI, 일괄 실행, 브로드캐스트",
|
||||
"activated": "Pro 활성화됨",
|
||||
"expiresAt": " · {{date}}까지 유효",
|
||||
"lifetime": " · 평생 라이선스",
|
||||
"oneTimeFee": "1회 구매 · 이 기기에서 평생 사용 · 구독 없음",
|
||||
"pasteLicense": "라이선스 붙여넣기",
|
||||
"activateButton": "활성화",
|
||||
"clearLicense": "로컬 라이선스 삭제",
|
||||
"paymentNote": "결제는 Waffo가 처리합니다. 이 앱은 카드 정보를 수집하지 않습니다.",
|
||||
"testDeviceId": "테스트 환경 · 기기 ID: {{deviceId}}",
|
||||
"later": "나중에 하기",
|
||||
"viewPro": "Pro 보기",
|
||||
"wallComingSoonSuffix": " · 출시 예정",
|
||||
"wallUnlock": "{{feature}} 잠금 해제",
|
||||
"wallMessageComingSoon": "이 Pro 기능은 아직 개발 중입니다. 조기 액세스를 위해 업그레이드하세요.",
|
||||
"wallMessageDefault": "이 기능은 OpsXShell Pro가 필요합니다. 이 기기에서 사용하려면 업그레이드하세요.",
|
||||
"checkoutUnavailable": "결제를 사용할 수 없습니다 ({{status}})",
|
||||
"freeTier": "무료",
|
||||
"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": "세션, 로컬 셸 및 기기 콘솔",
|
||||
"cards": {
|
||||
"quickConnect": {
|
||||
"title": "빠른 연결",
|
||||
"desc": "user@host:port"
|
||||
},
|
||||
"saveSession": {
|
||||
"title": "세션 저장",
|
||||
"desc": "자격 증명, 그룹, 프록시"
|
||||
},
|
||||
"serial": {
|
||||
"title": "시리얼 터미널",
|
||||
"desc": "보레이트 및 포트 설정"
|
||||
}
|
||||
},
|
||||
"sectionLocalShell": "로컬 셸",
|
||||
"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": "127.0.0.1:1080의 로컬 SOCKS5. 트래픽은 이 SSH 서버의 공인 IP를 통해 나갑니다.",
|
||||
"dynamicSingleHint": "SSH 호스트당 하나의 동적 규칙, 고정 포트 1080.",
|
||||
"dynamicPortHint": "If the port is busy, pick another local port (e.g. 1081).",
|
||||
"ruleList": "규칙",
|
||||
"ruleListEmpty": "아직 로컬/원격 규칙이 없습니다",
|
||||
"addSection": "새로 추가",
|
||||
"errorDynamicExists": "동적 규칙이 이미 존재합니다 (1080). 대신 시작하거나 중지하세요.",
|
||||
"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": "웹",
|
||||
"targetApi": "API",
|
||||
"remotePeerA": "원격 A",
|
||||
"remotePeerB": "원격 B",
|
||||
"remotePeerC": "원격 C",
|
||||
"cloudA": "클라우드 A",
|
||||
"cloudB": "클라우드 B",
|
||||
"internet": "인터넷",
|
||||
"localCaption": "로컬: 원격 포트를 로컬 포트인 것처럼 접근합니다.",
|
||||
"remoteCaption": "원격: 원격 접근을 로컬 서비스로 포워딩합니다.",
|
||||
"dynamicCaption": "동적: 이 컴퓨터가 현재 SSH 서버의 공인 IP를 통해 나가는 SOCKS5 프록시가 됩니다."
|
||||
},
|
||||
"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": "복사"
|
||||
}
|
||||
}
|
||||
@@ -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; 45초 핸드셰이크 시간 초과. 개발 중 인증서 확인은 완화됩니다.",
|
||||
"vncFootnote": "네이티브 vnc-rs RFB(Tight JPEG 디코딩); 클립보드는 UTF-8로 전송됩니다(매우 오래된 서버는 텍스트가 깨질 수 있음).",
|
||||
"errorHostRequired": "호스트 주소를 입력하세요",
|
||||
"errorUsernameRequired": "사용자 이름을 입력하세요"
|
||||
},
|
||||
"toolbar": {
|
||||
"pasteClipboard": "로컬 클립보드를 원격에 붙여넣기",
|
||||
"pasteAria": "원격에 붙여넣기",
|
||||
"shareDrive": "공유 드라이브에 로컬 파일 복사 (OpsXShell에서 로컬 다운로드 = 원격 다운로드)",
|
||||
"shareDriveAria": "공유 드라이브에 추가",
|
||||
"openShareDir": "공유 폴더를 로컬에서 열기 (다운로드)",
|
||||
"openShareDirAria": "공유 폴더 열기",
|
||||
"disconnect": "연결 끊기",
|
||||
"disconnectAria": "연결 끊기"
|
||||
},
|
||||
"status": {
|
||||
"connecting": "연결 중…",
|
||||
"connected": "연결됨",
|
||||
"disconnected": "연결 끊김",
|
||||
"connectFailed": "연결 실패",
|
||||
"clipboardSynced": "원격 클립보드 동기화됨",
|
||||
"savedToDownloads": "로컬 다운로드에 저장됨: {{name}}",
|
||||
"pastedToRemote": "원격에 붙여넣음",
|
||||
"fileTooLarge": "단일 파일 한도는 50MB입니다",
|
||||
"fileShared": "공유 다운로드에 추가됨: {{name}} (원격 이 PC에서 볼 수 있음)"
|
||||
}
|
||||
}
|
||||
@@ -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": "로컬 셸 생성 실패",
|
||||
"remoteCreateFailed": "원격 셸 생성 실패"
|
||||
},
|
||||
"proxy": {
|
||||
"connectFailed": "프록시 연결 실패",
|
||||
"authFailed": "프록시 인증 실패",
|
||||
"tunnelFailed": "프록시 터널 설정 실패",
|
||||
"unsupported": "지원되지 않는 프록시 유형",
|
||||
"jumpFailed": "점프 호스트 연결 실패",
|
||||
"hostRequired": "프록시 호스트가 필요합니다",
|
||||
"hostNoSpaces": "프록시 호스트에는 공백이 포함될 수 없습니다",
|
||||
"portRequired": "프록시 포트는 0보다 커야 합니다",
|
||||
"portTooHigh": "프록시 포트는 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": "먼저 설정 → AI에서 AI 제공자를 구성하세요",
|
||||
"noApiKey": "\"{{provider}}\"에 대해 저장된 API 키가 없습니다",
|
||||
"modelEmpty": "모델이 콘텐츠를 반환하지 않았습니다",
|
||||
"protocolFailed": "모델이 도구 프로토콜을 두 번 실패했습니다; 중지됨",
|
||||
"noConclusion": "모델이 사용 가능한 결론을 반환하지 않았습니다",
|
||||
"multipleCommands": "모델이 여러 명령을 반환했습니다; 실행이 거부되었습니다",
|
||||
"invalidCommand": "모델이 단일 한 줄 명령을 반환하지 않았습니다; 실행이 거부되었습니다",
|
||||
"repeatLoop": "반복된 명령 루프가 감지되었습니다; 중지됨: {{command}}",
|
||||
"criticalBlocked": "명령이 파괴적인 하드 차단에 걸렸습니다; 재정의 불가: {{command}}",
|
||||
"execFailed": "ssh-exec 실패: {{error}}",
|
||||
"maxSteps": "{{max}}단계 한도에 도달했습니다; 범위를 좁히고 재시도하세요",
|
||||
"sshRequired": "연결된 원격 SSH 세션이 필요합니다"
|
||||
},
|
||||
"zmodem": {
|
||||
"readFailed": "읽기 실패: {{name}}",
|
||||
"writeFailed": "쓰기 실패: {{name}}"
|
||||
},
|
||||
"unknown": {
|
||||
"error": "알 수 없는 오류가 발생했습니다"
|
||||
}
|
||||
}
|
||||
@@ -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": " · 로컬 에코"
|
||||
}
|
||||
}
|
||||
@@ -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": "1회성 SSH; 라이브러리에 저장되지 않음"
|
||||
},
|
||||
"newSession": {
|
||||
"title": "새 세션",
|
||||
"desc": "호스트 저장; 사이드바에서 더블클릭하여 연결"
|
||||
},
|
||||
"localShell": {
|
||||
"title": "로컬 셸",
|
||||
"selectShell": "셸 선택",
|
||||
"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": "호스트, user@host, user@host:port 지원",
|
||||
"password": "비밀번호",
|
||||
"passwordOptional": "선택 사항 · 키 사용 시 비워두세요",
|
||||
"connect": "연결",
|
||||
"errorInvalidTarget": "호스트를 입력하세요, 예: root@192.168.1.10 또는 opsbase.cn:5555",
|
||||
"errorConnectFailed": "연결 실패"
|
||||
},
|
||||
"dialog": {
|
||||
"create": "새 세션",
|
||||
"edit": "세션 편집",
|
||||
"subtitle": "1줄 대상 · 고급 옵션 접힘",
|
||||
"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": "prod, 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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"nav": {
|
||||
"general": "워크스페이스",
|
||||
"generalDesc": "레이아웃 및 리소스",
|
||||
"appearance": "외관",
|
||||
"appearanceDesc": "테마 및 언어",
|
||||
"terminal": "터미널",
|
||||
"terminalDesc": "글꼴 및 색상",
|
||||
"shortcuts": "단축키",
|
||||
"shortcutsDesc": "키 바인딩",
|
||||
"ssh": "SSH",
|
||||
"sshDesc": "연결 및 풀",
|
||||
"security": "보안",
|
||||
"securityDesc": "자격 증명 및 호스트 키",
|
||||
"ai": "AI 모델",
|
||||
"aiDesc": "AI 제공자",
|
||||
"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": "앱 UI 색상(터미널 색상과 별개)",
|
||||
"dark": "다크",
|
||||
"light": "라이트",
|
||||
"system": "시스템"
|
||||
},
|
||||
"terminal": {
|
||||
"fontGroup": "글꼴 및 크기",
|
||||
"fontFamily": "글꼴",
|
||||
"fontFamilyDesc": "Zsh 프롬프트 아이콘을 위해 Nerd Font를 사용하세요",
|
||||
"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": "연결 끊김을 줄이기 위해 유휴 시 keep-alive 전송",
|
||||
"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 라이선스 · Rust · XTerm.js"
|
||||
},
|
||||
"ai": {
|
||||
"presets": "제공자 프리셋",
|
||||
"add": "추가",
|
||||
"configured": "구성됨",
|
||||
"configuredHint": "제공자를 선택하고 추가를 클릭하세요",
|
||||
"emptyHint": "시작하려면 제공자를 추가하세요",
|
||||
"noModel": "선택된 모델 없음",
|
||||
"name": "이름",
|
||||
"model": "모델",
|
||||
"protocol": "프로토콜",
|
||||
"auth": "인증",
|
||||
"authNone": "없음",
|
||||
"test": "테스트",
|
||||
"testing": "테스트 중",
|
||||
"testingMessage": "테스트 중...",
|
||||
"saved": "저장됨",
|
||||
"retest": "다시 테스트해 주세요",
|
||||
"testFailed": "연결 테스트 실패",
|
||||
"available": "정상 · {{latency}} ms",
|
||||
"savedKeepBlank": "저장됨 — 유지하려면 비워두세요",
|
||||
"notRequired": "필요하지 않음",
|
||||
"otherModels": "다른 모델…",
|
||||
"customModel": "사용자 지정 모델",
|
||||
"backToList": "목록으로",
|
||||
"apiKeyOptional": "API 키 (필요하지 않음)",
|
||||
"advanced": "고급",
|
||||
"allowHttp": "HTTP 허용 (localhost/LAN)",
|
||||
"setActive": "활성으로 설정",
|
||||
"deleteTitle": "삭제",
|
||||
"apiKeySaveFailed": "API 키 저장 실패",
|
||||
"providerNotFound": "제공자를 찾을 수 없음",
|
||||
"modelCatalogReadFailed": "모델 카탈로그 읽기 실패",
|
||||
"catalogUnavailable": "models.dev를 사용할 수 없습니다"
|
||||
},
|
||||
"family": {
|
||||
"openai_compatible": "OpenAI 호환",
|
||||
"standalone": "────────",
|
||||
"plan": "플랜",
|
||||
"local": "셀프 호스팅",
|
||||
"custom": "사용자 지정"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"panel": {
|
||||
"local": "로컬",
|
||||
"remote": "원격",
|
||||
"notConnectedTitle": "원격 서버에 연결되지 않음",
|
||||
"notConnectedDesc": "SFTP를 사용하려면 먼저 SSH 세션을 연결하세요",
|
||||
"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": "{{completed}}개 항목에 대해 {{action}} 완료",
|
||||
"uploadAction": "업로드",
|
||||
"downloadAction": "다운로드",
|
||||
"noFolderUpload": "폴더 업로드 실패",
|
||||
"noDragPath": "드래그 앤 드롭 경로를 사용할 수 없습니다; 업로드를 사용하세요",
|
||||
"noFolderRecursive": "재귀 폴더 전송 실패; 재시도하거나 업로드를 사용하세요"
|
||||
}
|
||||
}
|
||||
@@ -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": "활성 터미널 없음"
|
||||
}
|
||||
}
|
||||
@@ -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": "유휴 시간 초과; 셸이 종료됨",
|
||||
"shellClosed": "셸이 종료됨",
|
||||
"shellClosedHint": "SSH 연결은 유지됩니다; 다른 창, SFTP 및 터널은 영향을 받지 않습니다",
|
||||
"reopenShell": "셸 다시 열기",
|
||||
"reopening": "여는 중…",
|
||||
"disconnected": "연결 끊김",
|
||||
"disconnectedHint": "SSH 세션이 종료되었거나 네트워크가 끊겼습니다. 아래를 클릭하여 재연결하세요.",
|
||||
"reconnect": "재연결",
|
||||
"suspended": "연결 일시 중단됨",
|
||||
"suspendedHint": "오랫동안 활동이 없어 리소스 절약을 위해 연결이 일시 중단되었습니다",
|
||||
"resume": "연결 재개",
|
||||
"connectFailed": "연결 실패",
|
||||
"connectFailedHint": "호스트, 포트, 사용자 이름 및 인증을 확인하세요",
|
||||
"retryConnect": "연결 재시도",
|
||||
"connecting": "연결 중…",
|
||||
"reconnecting": "자동 재연결 중{{attempt}}…",
|
||||
"reconnectingAttempt": " ({{count}})",
|
||||
"localShellExited": "로컬 셸이 종료됨"
|
||||
},
|
||||
"hostKey": {
|
||||
"titleNew": "호스트 키 확인",
|
||||
"titleChanged": "호스트 키가 변경됨",
|
||||
"descNew": "이 호스트에 처음 연결합니다. 신뢰하기 전에 핑거프린트를 확인하세요.",
|
||||
"descChanged": "이 호스트의 SSH 키가 로컬 기록과 더 이상 일치하지 않습니다. MITM 위험 가능성.",
|
||||
"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": "로컬 셸 생성 실패",
|
||||
"createRemoteShellFailed": "원격 셸 생성 실패",
|
||||
"createShellFailed": "셸 생성 실패: {{error}}"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "클립보드 읽기 실패",
|
||||
"writeFailed": "클립보드 쓰기 실패"
|
||||
},
|
||||
"input": {
|
||||
"failed": "터미널 입력 실패"
|
||||
},
|
||||
"connection": {
|
||||
"errorPrefix": "오류: {{message}}",
|
||||
"autoReconnecting": "자동 재연결 중 ({{attempt}})...",
|
||||
"autoReconnectLimit": "자동 재연결 한도 도달 ({{max}}){{reasonSuffix}}",
|
||||
"autoReconnectLimitReason": " — {{reason}}",
|
||||
"disconnectedRetry": "연결 끊김, {{seconds}}초 후 {{attempt}}/{{max}} 재시도...",
|
||||
"autoReconnectBanner": "[자동 재연결] {{seconds}}초 후 {{attempt}}/{{max}} 재시도 중",
|
||||
"disconnectedBanner": "[연결 끊김] {{reason}}",
|
||||
"noConfig": "사용 가능한 연결 정보가 없음"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "Агент 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": "Высокий риск требует подтверждения · критический блокируется · сеанс не сохраняется"
|
||||
},
|
||||
"safety": {
|
||||
"aria": "Режим безопасности агента",
|
||||
"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": "Отклонить",
|
||||
"once": "Один раз",
|
||||
"always": "Всегда",
|
||||
"hint": "Enter · Один раз Esc · Отклонить Всегда · пропускать похожие подтверждения в этом сеансе"
|
||||
},
|
||||
"error": {
|
||||
"noProvider": "Сначала настройте AI-провайдера в Настройки → AI",
|
||||
"noApiKey": "Для «{{provider}}» не сохранён API-ключ",
|
||||
"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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,326 @@
|
||||
{
|
||||
"action": {
|
||||
"confirm": "Подтвердить",
|
||||
"cancel": "Отмена",
|
||||
"close": "Закрыть",
|
||||
"delete": "Удалить",
|
||||
"save": "Сохранить",
|
||||
"create": "Создать",
|
||||
"copy": "Копировать",
|
||||
"copied": "Скопировано",
|
||||
"refresh": "Обновить",
|
||||
"gotIt": "Понятно",
|
||||
"edit": "Изменить",
|
||||
"open": "Открыть",
|
||||
"clone": "Клонировать",
|
||||
"reconnect": "Переподключиться",
|
||||
"disconnect": "Отключиться",
|
||||
"submit": "OK"
|
||||
},
|
||||
"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": "Открыть локальную оболочку",
|
||||
"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": "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": "Открыть локальную оболочку по умолчанию",
|
||||
"choose": "Выберите оболочку",
|
||||
"title": "Локальная оболочка",
|
||||
"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": "Возможности Pro",
|
||||
"unlock": "Разблокировать {{feature}}",
|
||||
"comingSoon": "Скоро",
|
||||
"activateSuccess": "Активировано",
|
||||
"activateFailed": "Сбой активации",
|
||||
"licenseActivated": "Лицензия Pro активирована",
|
||||
"paymentPending": "После оплаты вставьте лицензию сюда или попробуйте активировать позже",
|
||||
"invalidLicense": "Сбой активации: недействительная лицензия",
|
||||
"goUpgrade": "Обновить",
|
||||
"haveLicense": "Есть лицензия? Активировать",
|
||||
"title": "OpsXShell Pro · Оперативные возможности Pro",
|
||||
"subtitleComingSoon": "{{feature}} скоро · обновите Pro для раннего доступа",
|
||||
"subtitleUnlock": "Разблокировка: {{feature}}",
|
||||
"subtitleDefault": "Проброс портов, прокси, serial, AI, пакетное выполнение и рассылка",
|
||||
"activated": "Pro активирован",
|
||||
"expiresAt": " · действует до {{date}}",
|
||||
"lifetime": " · бессрочная лицензия",
|
||||
"oneTimeFee": "Разовая покупка · бессрочно на этом устройстве · без подписки",
|
||||
"pasteLicense": "Вставить лицензию",
|
||||
"activateButton": "Активировать",
|
||||
"clearLicense": "Очистить локальную лицензию",
|
||||
"paymentNote": "Оплата обрабатывается Waffo; это приложение не собирает данные карт.",
|
||||
"testDeviceId": "Тестовая среда · ID устройства: {{deviceId}}",
|
||||
"later": "Может быть позже",
|
||||
"viewPro": "Посмотреть Pro",
|
||||
"wallComingSoonSuffix": " · скоро",
|
||||
"wallUnlock": "Разблокировать {{feature}}",
|
||||
"wallMessageComingSoon": "Эта возможность Pro ещё в разработке. Обновите для раннего доступа.",
|
||||
"wallMessageDefault": "Эта функция требует OpsXShell Pro. Обновите, чтобы использовать её на этом устройстве.",
|
||||
"checkoutUnavailable": "Оформление недоступно ({{status}})",
|
||||
"freeTier": "Бесплатно",
|
||||
"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": "Сеансы, локальные оболочки и консоли устройств",
|
||||
"cards": {
|
||||
"quickConnect": { "title": "Быстрое подключение", "desc": "user@host:port" },
|
||||
"saveSession": { "title": "Сохранить сеанс", "desc": "Учётные данные, группы, прокси" },
|
||||
"serial": { "title": "Последовательный терминал", "desc": "Скорость (baud) и настройки порта" }
|
||||
},
|
||||
"sectionLocalShell": "Локальная оболочка",
|
||||
"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 или добавьте Local / Remote правила",
|
||||
"emptyAction": "Запустить 127.0.0.1:1080",
|
||||
"typeLocal": "Local",
|
||||
"typeRemote": "Remote",
|
||||
"typeDynamic": "Dynamic",
|
||||
"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 (можно менять). Трафик выходит через публичный IP этого SSH-сервера.",
|
||||
"dynamicSingleHint": "Одно правило Dynamic на SSH-хост; измените порт прослушивания при остановке.",
|
||||
"dynamicPortHint": "Если порт занят, выберите другой локальный порт (напр. 1081).",
|
||||
"ruleList": "Правила",
|
||||
"ruleListEmpty": "Правил Local / Remote пока нет",
|
||||
"addSection": "Добавить новое",
|
||||
"errorDynamicExists": "Dynamic уже существует. Запустите/остановите его или измените порт.",
|
||||
"diagram": {
|
||||
"title": "Как это работает",
|
||||
"localApp": "Локальное приложение",
|
||||
"sshHost": "SSH-хост",
|
||||
"remoteService": "Удалённый сервис",
|
||||
"remoteClient": "Удалённый клиент",
|
||||
"localService": "Локальный сервис",
|
||||
"localClient": "Локальный",
|
||||
"browser": "Локальный клиент",
|
||||
"socksProxy": "Локальный SOCKS",
|
||||
"anyTarget": "Любой адресат",
|
||||
"localSide": "Локально",
|
||||
"remoteSide": "Удалённо",
|
||||
"firewall": "Файрвол",
|
||||
"viaApp": "через OpsXShell",
|
||||
"viaSsh": "через SSH",
|
||||
"toTarget": "к цели",
|
||||
"toListen": "для прослушивания",
|
||||
"targetDb": "БД",
|
||||
"targetWeb": "Web",
|
||||
"targetApi": "API",
|
||||
"remotePeerA": "Удалённый A",
|
||||
"remotePeerB": "Удалённый B",
|
||||
"remotePeerC": "Удалённый C",
|
||||
"cloudA": "Облако A",
|
||||
"cloudB": "Облако B",
|
||||
"internet": "Интернет",
|
||||
"localCaption": "Local: обращение к удалённому порту как к локальному.",
|
||||
"remoteCaption": "Remote: удалённый доступ пробрасывается к локальному сервису.",
|
||||
"dynamicCaption": "Dynamic: эта машина становится прокси SOCKS5, выходящим через публичный IP текущего SSH-сервера."
|
||||
},
|
||||
"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": "Копировать"
|
||||
}
|
||||
}
|
||||
@@ -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; тайм-аут рукопожатия 45 с. Проверка сертификата во время разработки ослаблена.",
|
||||
"vncFootnote": "Нативный vnc-rs RFB с декодированием Tight JPEG; буфер обмена передаётся в UTF-8 (очень старые серверы могут искажать текст).",
|
||||
"errorHostRequired": "Введите адрес хоста",
|
||||
"errorUsernameRequired": "Введите имя пользователя"
|
||||
},
|
||||
"toolbar": {
|
||||
"pasteClipboard": "Вставить локальный буфер обмена на удалённый сервер",
|
||||
"pasteAria": "Вставить на удалённый сервер",
|
||||
"shareDrive": "Скопировать локальный файл в общий диск (локальная папка Downloads = удалённая Downloads в OpsXShell)",
|
||||
"shareDriveAria": "Добавить в общий диск",
|
||||
"openShareDir": "Открыть общую папку локально (Downloads)",
|
||||
"openShareDirAria": "Открыть общую папку",
|
||||
"disconnect": "Отключиться",
|
||||
"disconnectAria": "Отключиться"
|
||||
},
|
||||
"status": {
|
||||
"connecting": "Подключение…",
|
||||
"connected": "Подключено",
|
||||
"disconnected": "Отключено",
|
||||
"connectFailed": "Сбой подключения",
|
||||
"clipboardSynced": "Удалённый буфер обмена синхронизирован",
|
||||
"savedToDownloads": "Сохранено в локальную папку Downloads: {{name}}",
|
||||
"pastedToRemote": "Вставлено на удалённый сервер",
|
||||
"fileTooLarge": "Ограничение одного файла — 50 МБ",
|
||||
"fileShared": "Добавлено в общую папку Downloads: {{name}} (видно на удалённом «Этот компьютер»)"
|
||||
}
|
||||
}
|
||||
@@ -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": "Не удалось создать локальную оболочку",
|
||||
"remoteCreateFailed": "Не удалось создать удалённую оболочку"
|
||||
},
|
||||
"proxy": {
|
||||
"connectFailed": "Сбой подключения к прокси",
|
||||
"authFailed": "Сбой аутентификации прокси",
|
||||
"tunnelFailed": "Не удалось установить туннель прокси",
|
||||
"unsupported": "Неподдерживаемый тип прокси",
|
||||
"jumpFailed": "Сбой подключения через jump-хост",
|
||||
"hostRequired": "Требуется хост прокси",
|
||||
"hostNoSpaces": "Хост прокси не может содержать пробелы",
|
||||
"portRequired": "Порт прокси должен быть больше 0",
|
||||
"portTooHigh": "Порт прокси не может превышать 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": "Ограничение одного файла — 50 МБ",
|
||||
"nativeOnly": "Удалённые подключения доступны только в десктоп-приложении OpsXShell Tauri",
|
||||
"rdpNativeOnly": "RDP доступен только в десктоп-приложении OpsXShell Tauri",
|
||||
"vncNativeOnly": "VNC доступен только в десктоп-приложении OpsXShell Tauri"
|
||||
},
|
||||
"serial": {
|
||||
"openFailed": "Не удалось открыть последовательный порт",
|
||||
"writeFailed": "Сбой записи в последовательный порт",
|
||||
"nativeOnly": "Последовательные порты доступны только в десктоп-приложении Tauri"
|
||||
},
|
||||
"ai": {
|
||||
"noProvider": "Сначала настройте AI-провайдера в Настройки → AI",
|
||||
"noApiKey": "Для «{{provider}}» не сохранён API-ключ",
|
||||
"modelEmpty": "Модель не вернула содержимого",
|
||||
"protocolFailed": "Модель дважды нарушила протокол инструментов; остановлено",
|
||||
"noConclusion": "Модель не вернула пригодного итога",
|
||||
"multipleCommands": "Модель вернула несколько команд; выполнение отклонено",
|
||||
"invalidCommand": "Модель не вернула единственную однострочную команду; выполнение отклонено",
|
||||
"repeatLoop": "Обнаружен повторяющийся цикл команд; остановлено: {{command}}",
|
||||
"criticalBlocked": "Команда попала под деструктивную жёсткую блокировку; обход невозможен: {{command}}",
|
||||
"execFailed": "Сбой ssh-exec: {{error}}",
|
||||
"maxSteps": "Достигнут лимит в {{max}} шагов; сузьте задачу и повторите",
|
||||
"sshRequired": "Требуется подключённый удалённый SSH-сеанс"
|
||||
},
|
||||
"zmodem": {
|
||||
"readFailed": "Сбой чтения: {{name}}",
|
||||
"writeFailed": "Сбой записи: {{name}}"
|
||||
},
|
||||
"unknown": {
|
||||
"error": "Произошла неизвестная ошибка"
|
||||
}
|
||||
}
|
||||
@@ -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": "Скорость (baud)",
|
||||
"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": "Serial",
|
||||
"connected": "Подключено",
|
||||
"disconnected": "Отключено",
|
||||
"connecting": "Подключение…",
|
||||
"error": "Ошибка Serial",
|
||||
"configSummary": "{{path}} · {{baud}} · {{dataBits}}-{{parity}}-{{stopBits}}",
|
||||
"opening": "Открытие {{path}} @ {{baud}}...",
|
||||
"openFailed": "Не удалось открыть последовательный порт: {{message}}",
|
||||
"connectedBanner": "Подключено {{path}} · {{baud}} {{frame}} · {{lineEnding}}{{echo}}",
|
||||
"localEchoSuffix": " · локальный эхо-вывод"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
{
|
||||
"sidebar": {
|
||||
"quickConnect": "Быстрое подключение",
|
||||
"quickConnectShort": "Подключить",
|
||||
"newSession": "Новый сеанс",
|
||||
"newSessionShort": "Новый",
|
||||
"searchPlaceholder": "Поиск сеансов...",
|
||||
"batchMode": "Пакетные действия",
|
||||
"exitBatchMode": "Выйти из пакетного режима",
|
||||
"batchSelected": "Выбрано SSH: {{count}}",
|
||||
"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": "Локальная оболочка",
|
||||
"selectShell": "Выберите оболочку",
|
||||
"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": "Прокси · jump-хост · теги",
|
||||
"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": "prod, web",
|
||||
"startupCommand": "Команда при запуске (необязательно)",
|
||||
"startupCommandPlaceholder": "Выполнить после подключения, напр. cd /var/log",
|
||||
"proxy": "Прокси",
|
||||
"proxyNone": "Нет",
|
||||
"proxyHostPlaceholder": "Хост прокси",
|
||||
"proxyPortPlaceholder": "Порт",
|
||||
"proxyUserPlaceholder": "Имя пользователя (необязательно)",
|
||||
"proxyPasswordPlaceholder": "Пароль (необязательно)",
|
||||
"jumpHost": "Jump-хост (необязательно)",
|
||||
"jumpNone": "Без jump-хоста",
|
||||
"jumpNoneAlt": "Без jump-хоста",
|
||||
"jumpHint": "Сохранённый сеанс можно использовать как jump-хост"
|
||||
},
|
||||
"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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"nav": {
|
||||
"general": "Рабочее пространство",
|
||||
"generalDesc": "Макет и ресурсы",
|
||||
"appearance": "Внешний вид",
|
||||
"appearanceDesc": "Тема и язык",
|
||||
"terminal": "Терминал",
|
||||
"terminalDesc": "Шрифт и цвета",
|
||||
"shortcuts": "Горячие клавиши",
|
||||
"shortcutsDesc": "Назначение клавиш",
|
||||
"ssh": "SSH",
|
||||
"sshDesc": "Подключение и пул",
|
||||
"security": "Безопасность",
|
||||
"securityDesc": "Учётные данные и ключи хостов",
|
||||
"ai": "AI-модели",
|
||||
"aiDesc": "AI-провайдеры",
|
||||
"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": "Keep-alive",
|
||||
"keepAliveDesc": "Отправлять keep-alive при простое для уменьшения разрывов",
|
||||
"autoReconnect": "Авто-переподключение",
|
||||
"autoReconnectDesc": "Автоматически повторять после неожиданного разрыва",
|
||||
"timeout": "Тайм-аут подключения",
|
||||
"timeoutDesc": "Максимальное время ожидания при установке SSH (секунды)",
|
||||
"maxReconnect": "Попытки переподключения",
|
||||
"maxReconnectDesc": "Максимум повторов после неожиданного разрыва",
|
||||
"pool": "Пул подключений",
|
||||
"maxConnections": "Максимум подключений",
|
||||
"maxConnectionsDesc": "Общий лимит для SSH, SFTP и пакетных подключений",
|
||||
"maxBackground": "Лимит фоновых подключений",
|
||||
"maxBackgroundDesc": "Вытеснять давно не использованные подключения при превышении лимита",
|
||||
"suspend": "Фоновая приостановка",
|
||||
"suspendDesc": "Минуты до освобождения активных каналов, когда вкладка в фоне"
|
||||
},
|
||||
"security": {
|
||||
"credentials": "Защита учётных данных",
|
||||
"sessionPassword": "Пароли сеансов и парольные фразы ключей",
|
||||
"sessionPasswordDesc": "Шифруются AES-256-GCM в Rust перед сохранением; отключить нельзя",
|
||||
"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": "Пароли и парольные фразы ключей шифруются AES-256-GCM в Rust. OpsXShell не сохраняет историю команд терминала.",
|
||||
"license": "Лицензия MIT · Rust · XTerm.js"
|
||||
},
|
||||
"ai": {
|
||||
"presets": "Пресеты провайдеров",
|
||||
"add": "Добавить",
|
||||
"configured": "Настроено",
|
||||
"configuredHint": "Выберите провайдера и нажмите «Добавить»",
|
||||
"emptyHint": "Добавьте провайдера, чтобы начать",
|
||||
"noModel": "Модель не выбрана",
|
||||
"name": "Название",
|
||||
"model": "Модель",
|
||||
"protocol": "Протокол",
|
||||
"auth": "Аутентификация",
|
||||
"authNone": "Нет",
|
||||
"test": "Проверить",
|
||||
"testing": "Проверка",
|
||||
"testingMessage": "Проверка...",
|
||||
"saved": "Сохранено",
|
||||
"retest": "Пожалуйста, перепроверьте",
|
||||
"testFailed": "Сбой проверки подключения",
|
||||
"available": "OK · {{latency}} мс",
|
||||
"savedKeepBlank": "Сохранено — оставьте пустым, чтобы сохранить",
|
||||
"notRequired": "Не требуется",
|
||||
"otherModels": "Другие модели…",
|
||||
"customModel": "Своя модель",
|
||||
"backToList": "Назад к списку",
|
||||
"apiKeyOptional": "API Key (не требуется)",
|
||||
"advanced": "Дополнительно",
|
||||
"allowHttp": "Разрешить HTTP (localhost/LAN)",
|
||||
"setActive": "Сделать активным",
|
||||
"deleteTitle": "Удалить",
|
||||
"apiKeySaveFailed": "Не удалось сохранить API-ключ",
|
||||
"providerNotFound": "Провайдер не найден",
|
||||
"modelCatalogReadFailed": "Не удалось прочитать каталог моделей",
|
||||
"catalogUnavailable": "models.dev недоступен"
|
||||
},
|
||||
"family": {
|
||||
"openai_compatible": "Совместимый с OpenAI",
|
||||
"standalone": "────────",
|
||||
"plan": "План",
|
||||
"local": "Self-hosted",
|
||||
"custom": "Своё"
|
||||
}
|
||||
}
|
||||
@@ -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": "Скрыть dot-файлы (.xxx)",
|
||||
"showHiddenAria": "Показать скрытые файлы",
|
||||
"hideHiddenAria": "Скрыть dot-файлы",
|
||||
"searchAria": "Поиск в {{title}}"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Загрузка...",
|
||||
"selected": "Выбрано: {{count}}",
|
||||
"filtered": "Показано {{shown}} / {{total}}",
|
||||
"hiddenCount": "{{total}} объектов ({{hidden}} скрыто)",
|
||||
"total": "Объектов: {{count}}",
|
||||
"filterHint": "Фильтр: {{query}}"
|
||||
},
|
||||
"empty": {
|
||||
"dirTitle": "Пустой каталог",
|
||||
"dirDescLocal": "В этом каталоге нет файлов",
|
||||
"dirDescRemote": "Попробуйте перейти вверх или обновить",
|
||||
"goUp": "Перейти вверх",
|
||||
"hiddenOnlyTitle": "Только скрытые файлы",
|
||||
"hiddenOnlyDesc": "Нажмите значок глаза в шапке, чтобы показать dot-файлы",
|
||||
"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 сохранить · максимум ~2 МБ",
|
||||
"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": "Сбой рекурсивной передачи папки; повторите или используйте «Загрузить»"
|
||||
}
|
||||
}
|
||||
@@ -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": "Нет активного терминала"
|
||||
}
|
||||
}
|
||||
@@ -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": "Тайм-аут простоя; оболочка завершилась",
|
||||
"shellClosed": "Оболочка завершилась",
|
||||
"shellClosedHint": "SSH-подключение сохранено; остальные панели, SFTP и туннели не затронуты",
|
||||
"reopenShell": "Открыть оболочку снова",
|
||||
"reopening": "Открытие…",
|
||||
"disconnected": "Отключено",
|
||||
"disconnectedHint": "SSH-сеанс завершился или сеть упала. Нажмите ниже, чтобы переподключиться.",
|
||||
"reconnect": "Переподключиться",
|
||||
"suspended": "Подключение приостановлено",
|
||||
"suspendedHint": "Долгое отсутствие активности; подключение приостановлено для экономии ресурсов",
|
||||
"resume": "Возобновить подключение",
|
||||
"connectFailed": "Сбой подключения",
|
||||
"connectFailedHint": "Проверьте хост, порт, имя пользователя и аутентификацию",
|
||||
"retryConnect": "Повторить подключение",
|
||||
"connecting": "Подключение…",
|
||||
"reconnecting": "Автопереподключение{{attempt}}…",
|
||||
"reconnectingAttempt": " ({{count}})",
|
||||
"localShellExited": "Локальная оболочка завершилась"
|
||||
},
|
||||
"hostKey": {
|
||||
"titleNew": "Проверка ключа хоста",
|
||||
"titleChanged": "Ключ хоста изменился",
|
||||
"descNew": "Первое подключение к этому хосту. Проверьте отпечаток перед доверием.",
|
||||
"descChanged": "SSH-ключ этого хоста больше не совпадает с локальной записью. Возможен риск MITM.",
|
||||
"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": "✓ Сохранено в Downloads",
|
||||
"savedDownloadsMultiple": "✓ Сохранено файлов: {{count}} в Downloads",
|
||||
"nativeApiUnavailable": "Нативный API недоступен",
|
||||
"readFailed": "Сбой чтения: {{name}}",
|
||||
"writeFailed": "Сбой записи: {{name}}",
|
||||
"createLocalShellFailed": "Не удалось создать локальную оболочку",
|
||||
"createRemoteShellFailed": "Не удалось создать удалённую оболочку",
|
||||
"createShellFailed": "Не удалось создать оболочку: {{error}}"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Не удалось прочитать буфер обмена",
|
||||
"writeFailed": "Не удалось записать в буфер обмена"
|
||||
},
|
||||
"input": {
|
||||
"failed": "Сбой ввода в терминал"
|
||||
},
|
||||
"connection": {
|
||||
"errorPrefix": "Ошибка: {{message}}",
|
||||
"autoReconnecting": "Автопереподключение ({{attempt}})...",
|
||||
"autoReconnectLimit": "Достигнут предел автопереподключений ({{max}}){{reasonSuffix}}",
|
||||
"autoReconnectLimitReason": " — {{reason}}",
|
||||
"disconnectedRetry": "Отключено, повтор {{attempt}}/{{max}} через {{seconds}} с...",
|
||||
"autoReconnectBanner": "[Автопереподключение] Повтор {{attempt}}/{{max}} через {{seconds}} с",
|
||||
"disconnectedBanner": "[Отключено] {{reason}}",
|
||||
"noConfig": "Данные для подключения отсутствуют"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "Agent CLI",
|
||||
"modelConfigured": "{{provider}} · {{model}}",
|
||||
"modelNotConfigured": "Chưa cấu hình mô hình",
|
||||
"sshReady": "SSH · {{target}}",
|
||||
"sshNotConnected": "Chưa có SSH từ xa nào được kết nối",
|
||||
"defaultTarget": "Phiên SSH hiện tại",
|
||||
"emptyHint": "Mô tả một tác vụ vận hành và gửi. Theo dõi trong cùng luồng, hoặc nhấn + cho chủ đề mới.",
|
||||
"newTopic": "Chủ đề mới",
|
||||
"close": "Đóng",
|
||||
"thinking": "Đang suy nghĩ…",
|
||||
"conclusion": "Kết luận",
|
||||
"copy": "Sao chép",
|
||||
"copied": "Đã sao chép",
|
||||
"stop": "Dừng",
|
||||
"send": "Gửi",
|
||||
"placeholder": "Tác vụ hoặc theo dõi… (Enter để gửi, Shift+Enter để xuống dòng)",
|
||||
"hintFollowUp": "Các theo dõi bao gồm ngữ cảnh của luồng này",
|
||||
"hintSelection": "Sẽ bao gồm {{lines}} dòng đã chọn",
|
||||
"hintSteps": "Tối đa {{max}} bước · không lưu gì",
|
||||
"footerNote": "Rủi ro cao cần xác nhận · rủi ro nghiêm trọng bị chặn · phiên không được lưu"
|
||||
},
|
||||
"safety": {
|
||||
"aria": "Chế độ an toàn của agent",
|
||||
"strict": {
|
||||
"label": "Nghiêm ngặt",
|
||||
"short": "Xác nhận từ rủi ro trung bình",
|
||||
"description": "Thay đổi tệp, sửa quyền và lệnh rủi ro cao hơn cần xác nhận. Tốt nhất cho môi trường sản xuất hoặc máy chủ lạ."
|
||||
},
|
||||
"relaxed": {
|
||||
"label": "Thoải mái",
|
||||
"short": "Chỉ xác nhận rủi ro cao",
|
||||
"description": "Chỉ đọc và chỉnh sửa thông thường chạy tự động; xóa, khởi động lại, cài đặt, v.v. cần xác nhận."
|
||||
}
|
||||
},
|
||||
"risk": {
|
||||
"safe": "An toàn",
|
||||
"low": "Rủi ro thấp",
|
||||
"medium": "Rủi ro trung bình",
|
||||
"high": "Rủi ro cao",
|
||||
"critical": "Đã chặn"
|
||||
},
|
||||
"step": {
|
||||
"round": "Bước {{round}}",
|
||||
"awaiting": "Đang chờ phê duyệt",
|
||||
"running": "Đang chạy",
|
||||
"done": "Xong",
|
||||
"confirmTitle": "Bước {{round}} · {{risk}}",
|
||||
"confirmMessage": "SSH · {{target}}\n{{mode}}\n\n$ {{command}}",
|
||||
"rejected": "Lệnh bước {{round}} đã bị từ chối.",
|
||||
"terminated": "Đã chấm dứt",
|
||||
"stoppedMessage": "Đã dừng. Đã yêu cầu ngắt cho lệnh từ xa đang chạy."
|
||||
},
|
||||
"confirm": {
|
||||
"reject": "Từ chối",
|
||||
"once": "Một lần",
|
||||
"always": "Luôn luôn",
|
||||
"hint": "Enter · Một lần Esc · Từ chối Luôn luôn · bỏ qua các xác nhận tương tự trong phiên này"
|
||||
},
|
||||
"error": {
|
||||
"noProvider": "Cấu hình nhà cung cấp AI trong Cài đặt → AI trước tiên",
|
||||
"noApiKey": "Chưa lưu API key cho \"{{provider}}\"",
|
||||
"emptyTask": "Nhập một tác vụ hoặc theo dõi",
|
||||
"sshRequired": "Cần một phiên SSH từ xa đã kết nối",
|
||||
"modelEmpty": "Mô hình không trả về nội dung nào",
|
||||
"protocolFailed": "Mô hình thất bại giao thức công cụ hai lần; đã dừng",
|
||||
"noConclusion": "Mô hình không trả về kết luận dùng được",
|
||||
"multipleCommands": "Mô hình trả về nhiều lệnh; từ chối thực thi",
|
||||
"invalidCommand": "Mô hình không trả về một lệnh một dòng duy nhất; từ chối thực thi",
|
||||
"repeatLoop": "Phát hiện vòng lặp lệnh lặp lại; đã dừng: {{command}}",
|
||||
"criticalBlocked": "Lệnh gặp chặn cứng phá hủy; không có ghi đè: {{command}}",
|
||||
"execFailed": "ssh-exec thất bại: {{error}}",
|
||||
"execUnknown": "Lỗi không xác định",
|
||||
"execNoOutput": "Lệnh hoàn tất không có đầu ra",
|
||||
"maxSteps": "Đã đạt giới hạn {{max}} bước; thu hẹp phạm vi và thử lại"
|
||||
},
|
||||
"output": {
|
||||
"empty": "(đầu ra rỗng)",
|
||||
"truncatedMiddle": "... [{{count}} dòng bị bỏ qua] ...",
|
||||
"totalLines": "Tổng số dòng: {{count}}{{truncatedSuffix}}",
|
||||
"truncatedSuffix": " (đầu/cuối được giữ lại)",
|
||||
"errorLines": "Dòng lỗi/cảnh báo có thể có ({{count}}):\n{{lines}}",
|
||||
"noErrorKeywords": "Không tìm thấy từ khóa lỗi rõ ràng nào",
|
||||
"snippetLabel": "Đoạn đầu ra:\n{{snippet}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,335 @@
|
||||
{
|
||||
"action": {
|
||||
"confirm": "Xác nhận",
|
||||
"cancel": "Hủy",
|
||||
"close": "Đóng",
|
||||
"delete": "Xóa",
|
||||
"save": "Lưu",
|
||||
"create": "Tạo",
|
||||
"copy": "Sao chép",
|
||||
"copied": "Đã sao chép",
|
||||
"refresh": "Làm mới",
|
||||
"gotIt": "Đã hiểu",
|
||||
"edit": "Sửa",
|
||||
"open": "Mở",
|
||||
"clone": "Nhân bản",
|
||||
"reconnect": "Kết nối lại",
|
||||
"disconnect": "Ngắt kết nối",
|
||||
"submit": "OK"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Đang tải...",
|
||||
"processing": "Đang xử lý...",
|
||||
"connecting": "Đang kết nối...",
|
||||
"connected": "Đã kết nối",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"background": "Chạy nền",
|
||||
"suspended": "Đã tạm dừng",
|
||||
"reconnecting": "Đang kết nối lại",
|
||||
"error": "Lỗi kết nối",
|
||||
"reading": "Đang tải...",
|
||||
"saving": "Đang lưu..."
|
||||
},
|
||||
"error": {
|
||||
"title": "Đã xảy ra lỗi",
|
||||
"body": "Ứng dụng gặp sự cố bất ngờ",
|
||||
"recoverable": "Lỗi này có thể khôi phục. Hãy thử làm mới trang.",
|
||||
"refreshPage": "Làm mới trang",
|
||||
"restartApp": "Khởi động lại ứng dụng",
|
||||
"supportHint": "Nếu sự cố vẫn tiếp diễn, hãy kiểm tra nhật ký hoặc liên hệ hỗ trợ"
|
||||
},
|
||||
"toast": {
|
||||
"closeAria": "Đóng thông báo"
|
||||
},
|
||||
"metrics": {
|
||||
"timezone": "Múi giờ {{value}}",
|
||||
"memory": "Bộ nhớ {{percent}}%{{detail}}",
|
||||
"sessionTransfer": "Lưu lượng phiên {{value}}"
|
||||
},
|
||||
"palette": {
|
||||
"title": "Bảng lệnh",
|
||||
"aria": "Bảng lệnh",
|
||||
"placeholder": "Tìm lệnh, phiên, hoặc đoạn mã lệnh...",
|
||||
"empty": "Không có kết quả phù hợp",
|
||||
"emptyHint": "Thử từ khóa khác",
|
||||
"resultCount": "{{count}} kết quả",
|
||||
"badge": {
|
||||
"command": "Lệnh",
|
||||
"session": "Phiên",
|
||||
"snippet": "Đoạn mã"
|
||||
},
|
||||
"hint": {
|
||||
"nav": "Di chuyển",
|
||||
"run": "Chạy",
|
||||
"close": "Đóng"
|
||||
},
|
||||
"cmd": {
|
||||
"newSession": "Phiên mới",
|
||||
"newSessionDesc": "Tạo hồ sơ phiên SSH mới",
|
||||
"quickConnect": "Kết nối nhanh",
|
||||
"quickConnectDesc": "Kết nối trực tiếp bằng thông tin máy chủ",
|
||||
"localTerminal": "Terminal cục bộ",
|
||||
"localTerminalDesc": "Mở shell cục bộ",
|
||||
"settings": "Mở cài đặt",
|
||||
"settingsDesc": "Tùy chọn ứng dụng",
|
||||
"toggleSidebar": "Bật/tắt thanh bên",
|
||||
"toggleSidebarDesc": "Ẩn thanh bên để tập trung vào terminal",
|
||||
"newTab": "Tab mới",
|
||||
"closeTab": "Đóng tab hiện tại",
|
||||
"closeAllTabs": "Đóng tất cả tab",
|
||||
"portForward": "Chuyển tiếp cổng mới",
|
||||
"upgradePro": "Nâng cấp OpsXShell Pro",
|
||||
"editSession": "Sửa phiên: {{name}}"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"welcome": "Chào mừng",
|
||||
"new": "Tab mới",
|
||||
"settings": "Cài đặt",
|
||||
"portForward": "Chuyển tiếp cổng",
|
||||
"terminal": "Terminal",
|
||||
"batch": "Thực thi hàng loạt",
|
||||
"newTerminal": "Terminal mới",
|
||||
"kind": {
|
||||
"terminal": "Terminal",
|
||||
"sftp": "SFTP",
|
||||
"portforward": "Chuyển tiếp",
|
||||
"serial": "Serial",
|
||||
"rdp": "RDP",
|
||||
"vnc": "VNC",
|
||||
"batch": "Hàng loạt",
|
||||
"settings": "Cài đặt"
|
||||
},
|
||||
"menu": {
|
||||
"closeOthers": "Đóng các tab khác",
|
||||
"closeRight": "Đóng các tab bên phải",
|
||||
"closeLeft": "Đóng các tab bên trái",
|
||||
"closeAll": "Đóng tất cả",
|
||||
"clone": "Nhân đôi tab"
|
||||
}
|
||||
},
|
||||
"sidebar": {
|
||||
"brandSub": "Terminal SSH / SFTP",
|
||||
"collapse": "Thu gọn thanh bên (Ctrl/Cmd+B)",
|
||||
"collapseAria": "Thu gọn thanh bên",
|
||||
"expand": "Mở rộng thanh bên",
|
||||
"expandAria": "Mở rộng thanh bên",
|
||||
"toggle": "Bật/tắt thanh bên",
|
||||
"searchPlaceholder": "Tìm kiếm...",
|
||||
"localShell": {
|
||||
"openDefault": "Mở shell cục bộ mặc định",
|
||||
"choose": "Chọn shell",
|
||||
"title": "Shell cục bộ",
|
||||
"subtitle": "Mở terminal trên máy này",
|
||||
"default": "Mặc định"
|
||||
}
|
||||
},
|
||||
"connectionPanel": {
|
||||
"title": "Kết nối",
|
||||
"empty": "Không có kết nối",
|
||||
"emptyDesc": "Chưa có kết nối nào đang hoạt động. Chúng sẽ hiển thị tại đây sau khi bạn kết nối tới máy chủ.",
|
||||
"stat": {
|
||||
"total": "Tổng",
|
||||
"active": "Đang hoạt động",
|
||||
"background": "Chạy nền",
|
||||
"error": "Ngắt kết nối/lỗi"
|
||||
},
|
||||
"status": {
|
||||
"connected": "Đã kết nối",
|
||||
"connecting": "Đang kết nối",
|
||||
"background": "Chạy nền",
|
||||
"suspended": "Đã tạm dừng",
|
||||
"error": "Lỗi",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"reconnecting": "Đang kết nối lại"
|
||||
},
|
||||
"refCount": "×{{count}} tham chiếu",
|
||||
"reconnect": "Kết nối lại",
|
||||
"reconnecting": "Đang kết nối lại...",
|
||||
"disconnect": "Ngắt kết nối"
|
||||
},
|
||||
"pro": {
|
||||
"upgrade": "Nâng cấp Pro",
|
||||
"feature": "Tính năng Pro",
|
||||
"unlock": "Mở khóa {{feature}}",
|
||||
"comingSoon": "Sắp ra mắt",
|
||||
"activateSuccess": "Đã kích hoạt",
|
||||
"activateFailed": "Kích hoạt thất bại",
|
||||
"licenseActivated": "Giấy phép Pro đã được kích hoạt",
|
||||
"paymentPending": "Sau khi thanh toán, hãy dán giấy phép của bạn vào đây hoặc thử kích hoạt lại sau",
|
||||
"invalidLicense": "Kích hoạt thất bại: giấy phép không hợp lệ",
|
||||
"goUpgrade": "Nâng cấp",
|
||||
"haveLicense": "Có giấy phép? Kích hoạt",
|
||||
"title": "OpsXShell Pro · Mở khóa các tính năng vận hành chuyên nghiệp",
|
||||
"subtitleComingSoon": "{{feature}} sắp ra mắt · nâng cấp Pro để truy cập sớm",
|
||||
"subtitleUnlock": "Đang mở khóa: {{feature}}",
|
||||
"subtitleDefault": "Chuyển tiếp cổng, proxy, serial, AI, hàng loạt và phát sóng",
|
||||
"activated": "Đã kích hoạt Pro",
|
||||
"expiresAt": " · hợp lệ đến {{date}}",
|
||||
"lifetime": " · giấy phép trọn đời",
|
||||
"oneTimeFee": "Mua một lần · trọn đời trên thiết bị này · không cần đăng ký",
|
||||
"pasteLicense": "Dán giấy phép",
|
||||
"activateButton": "Kích hoạt",
|
||||
"clearLicense": "Xóa giấy phép cục bộ",
|
||||
"paymentNote": "Thanh toán được xử lý bởi Waffo; ứng dụng này không thu thập thông tin thẻ.",
|
||||
"testDeviceId": "Môi trường thử nghiệm · ID thiết bị: {{deviceId}}",
|
||||
"later": "Để sau",
|
||||
"viewPro": "Xem Pro",
|
||||
"wallComingSoonSuffix": " · sắp ra mắt",
|
||||
"wallUnlock": "Mở khóa {{feature}}",
|
||||
"wallMessageComingSoon": "Tính năng Pro này vẫn đang được phát triển. Nâng cấp để truy cập sớm.",
|
||||
"wallMessageDefault": "Tính năng này yêu cầu OpsXShell Pro. Nâng cấp để sử dụng trên thiết bị này.",
|
||||
"checkoutUnavailable": "Không thể thanh toán ({{status}})",
|
||||
"freeTier": "Miễn phí",
|
||||
"proTier": "Pro",
|
||||
"freeItems": {
|
||||
"ssh": "Terminal SSH",
|
||||
"sftp": "Quản lý tệp SFTP",
|
||||
"local": "Terminal cục bộ",
|
||||
"crud": "Tạo/đọc/sửa/xóa phiên",
|
||||
"import": "Nhập đơn lẻ / ssh_config"
|
||||
},
|
||||
"proItems": {
|
||||
"forward": "Chuyển tiếp cổng",
|
||||
"proxy": "Proxy phiên / SOCKS",
|
||||
"serial": "Terminal Serial",
|
||||
"ai": "Trợ lý AI terminal",
|
||||
"batch": "Thực thi hàng loạt / đồng bộ phát sóng",
|
||||
"broadcast": "Đồng bộ đầu vào phát sóng",
|
||||
"importExport": "Nhập/xuất máy chủ hàng loạt",
|
||||
"desktop": "Màn hình từ xa RDP / VNC"
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"title": "Khởi động nhanh",
|
||||
"description": "Phiên, shell cục bộ và bảng điều khiển thiết bị",
|
||||
"cards": {
|
||||
"quickConnect": {
|
||||
"title": "Kết nối nhanh",
|
||||
"desc": "người_dùng@máy_chủ:cổng"
|
||||
},
|
||||
"saveSession": {
|
||||
"title": "Lưu phiên",
|
||||
"desc": "Thông tin xác thực, nhóm, proxy"
|
||||
},
|
||||
"serial": {
|
||||
"title": "Terminal Serial",
|
||||
"desc": "Tốc độ baud và cài đặt cổng"
|
||||
}
|
||||
},
|
||||
"sectionLocalShell": "Shell cục bộ",
|
||||
"sectionSavedSessions": "Phiên đã lưu",
|
||||
"systemDefault": "Mặc định hệ thống"
|
||||
},
|
||||
"statusBar": {
|
||||
"socksLabel": "Chuyển tiếp",
|
||||
"socksIdle": "Mở chuyển tiếp cổng · nhấp chuột phải để sao chép SOCKS",
|
||||
"socksRunning": "SOCKS5 đang chạy · nhấp để quản lý · nhấp chuột phải để sao chép",
|
||||
"forwardOpenIdle": "Mở chuyển tiếp cổng · nhấp chuột phải để sao chép socks5://127.0.0.1:{{port}}",
|
||||
"forwardOpenRunning": "SOCKS5 đang chạy (:{{port}}) · nhấp để quản lý · nhấp chuột phải để sao chép",
|
||||
"forwardStarted": "Đã bắt đầu chuyển tiếp",
|
||||
"forwardStartedDynamic": "Đã khởi động SOCKS5: socks5://127.0.0.1:{{port}}",
|
||||
"socksStartFailed": "Khởi động thất bại: {{message}}",
|
||||
"socksStopFailed": "Dừng thất bại: {{message}}",
|
||||
"socksCopied": "Đã sao chép socks5://127.0.0.1:{{port}}"
|
||||
},
|
||||
"portForward": {
|
||||
"title": "Chuyển tiếp cổng",
|
||||
"connectedAs": "Đã kết nối: {{target}}",
|
||||
"notConnected": "Chưa kết nối — hãy thiết lập SSH trước",
|
||||
"socksDefaultHint": "SOCKS5 cục bộ: 127.0.0.1:1080",
|
||||
"socksRunning": "SOCKS5 đang chạy",
|
||||
"socksStart": "Khởi động SOCKS5",
|
||||
"addRule": "Thêm",
|
||||
"emptyTitle": "Không có chuyển tiếp cổng",
|
||||
"emptyDesc": "Khởi động SOCKS5, hoặc thêm quy tắc Cục bộ / Từ xa",
|
||||
"emptyAction": "Khởi động 127.0.0.1:1080",
|
||||
"typeLocal": "Cục bộ",
|
||||
"typeRemote": "Từ xa",
|
||||
"typeDynamic": "Động",
|
||||
"running": "Đang chạy",
|
||||
"socksProxy": "SOCKS5: 127.0.0.1:{{port}}",
|
||||
"remoteToLocal": "Từ xa {{remote}} → cục bộ {{local}}",
|
||||
"stats": "{{connections}} kết nối · ↑{{up}} · ↓{{down}}",
|
||||
"copyProxy": "Sao chép proxy",
|
||||
"copyRule": "Nhân đôi quy tắc",
|
||||
"editRule": "Sửa",
|
||||
"stopListener": "Dừng",
|
||||
"start": "Khởi động",
|
||||
"delete": "Xóa",
|
||||
"editTitle": "Sửa chuyển tiếp",
|
||||
"addTitle": "Thêm chuyển tiếp",
|
||||
"typeLocalDesc": "Cục bộ → từ xa",
|
||||
"typeRemoteDesc": "Từ xa → cục bộ",
|
||||
"typeDynamicDesc": "SOCKS5",
|
||||
"selectType": "Loại",
|
||||
"drawerSubtitle": "Đường hầm qua phiên SSH hiện tại",
|
||||
"ruleFields": "Chi tiết",
|
||||
"dynamicHint": "SOCKS5 cục bộ tại 127.0.0.1:1080. Lưu lượng thoát qua địa chỉ IP công cộng của máy chủ SSH này.",
|
||||
"dynamicSingleHint": "Một quy tắc Động cho mỗi máy chủ SSH, cổng cố định 1080.",
|
||||
"dynamicPortHint": "If the port is busy, pick another local port (e.g. 1081).",
|
||||
"ruleList": "Quy tắc",
|
||||
"ruleListEmpty": "Chưa có quy tắc Cục bộ / Từ xa nào",
|
||||
"addSection": "Thêm mới",
|
||||
"errorDynamicExists": "Quy tắc Động đã tồn tại (1080). Hãy khởi động hoặc dừng nó thay vì thêm mới.",
|
||||
"diagram": {
|
||||
"title": "Cách hoạt động",
|
||||
"localApp": "Ứng dụng cục bộ",
|
||||
"sshHost": "Máy chủ SSH",
|
||||
"remoteService": "Dịch vụ từ xa",
|
||||
"remoteClient": "Máy khách từ xa",
|
||||
"localService": "Dịch vụ cục bộ",
|
||||
"localClient": "Cục bộ",
|
||||
"browser": "Máy khách cục bộ",
|
||||
"socksProxy": "SOCKS cục bộ",
|
||||
"anyTarget": "Bất kỳ đích nào",
|
||||
"localSide": "Cục bộ",
|
||||
"remoteSide": "Từ xa",
|
||||
"firewall": "Tường lửa",
|
||||
"viaApp": "qua OpsXShell",
|
||||
"viaSsh": "qua SSH",
|
||||
"toTarget": "tới đích",
|
||||
"toListen": "lắng nghe",
|
||||
"targetDb": "CSDL",
|
||||
"targetWeb": "Web",
|
||||
"targetApi": "API",
|
||||
"remotePeerA": "Từ xa A",
|
||||
"remotePeerB": "Từ xa B",
|
||||
"remotePeerC": "Từ xa C",
|
||||
"cloudA": "Đám mây A",
|
||||
"cloudB": "Đám mây B",
|
||||
"internet": "Internet",
|
||||
"localCaption": "Cục bộ: truy cập một cổng từ xa như thể nó là cổng cục bộ.",
|
||||
"remoteCaption": "Từ xa: quyền truy cập từ xa được chuyển tiếp tới dịch vụ cục bộ.",
|
||||
"dynamicCaption": "Động: máy này trở thành proxy SOCKS5 thoát qua IP công cộng của máy chủ SSH hiện tại."
|
||||
},
|
||||
"ruleName": "Tên",
|
||||
"ruleNamePlaceholder": "vd. MySQL",
|
||||
"localListenPort": "Cổng lắng nghe cục bộ",
|
||||
"localTargetPort": "Cổng đích cục bộ",
|
||||
"remoteTargetPort": "Cổng đích từ xa",
|
||||
"remoteListenPort": "Cổng lắng nghe từ xa",
|
||||
"portPlaceholder": "vd. 3306",
|
||||
"remoteHost": "Máy chủ từ xa",
|
||||
"remoteHostPlaceholder": "localhost hoặc IP",
|
||||
"socksRuleName": "Proxy SOCKS5",
|
||||
"defaultLocalName": "Chuyển tiếp cục bộ",
|
||||
"defaultRemoteName": "Chuyển tiếp từ xa",
|
||||
"sessionRestoredTitle": "Phiên đã được khôi phục",
|
||||
"sessionRestoredDesc": "Tab chuyển tiếp cổng từ phiên trước đó của bạn đã được khôi phục.\nKết nối lại SSH để sử dụng lại.",
|
||||
"stopEditTitle": "Dừng trước khi sửa",
|
||||
"stopEditMessage": "Chuyển tiếp này đang chạy. Dừng nó trước khi sửa?",
|
||||
"stopEditConfirm": "Dừng và sửa",
|
||||
"deleteTitle": "Xóa quy tắc",
|
||||
"deleteRunning": "Chuyển tiếp đang chạy sẽ được dừng trước.",
|
||||
"deleteConfirm": "Xóa quy tắc này?",
|
||||
"errorNamePort": "Nhập tên và cổng hợp lệ (1–65535)",
|
||||
"errorTargetPort": "Nhập cổng đích hợp lệ (1–65535)",
|
||||
"errorRemoteHost": "Nhập máy chủ từ xa",
|
||||
"errorNotConnected": "Chưa kết nối",
|
||||
"errorStartFailed": "Khởi động thất bại",
|
||||
"errorStopFailed": "Dừng thất bại",
|
||||
"errorSocksRunning": "SOCKS5 đã đang chạy",
|
||||
"copySuffix": "Sao chép"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"connect": {
|
||||
"rdpTitle": "Kết nối RDP",
|
||||
"vncTitle": "Kết nối VNC",
|
||||
"rdpDesc": "Màn hình từ xa Windows · engine IronRDP gốc",
|
||||
"vncDesc": "Màn hình từ xa VNC / RFB · engine gốc",
|
||||
"confirm": "Kết nối",
|
||||
"host": "Máy chủ",
|
||||
"hostPlaceholderRdp": "windows.example.com",
|
||||
"hostPlaceholderVnc": "192.168.1.10",
|
||||
"port": "Cổng",
|
||||
"username": "Tên người dùng",
|
||||
"domain": "Tên miền (tùy chọn)",
|
||||
"password": "Mật khẩu",
|
||||
"passwordOptional": "Mật khẩu (tùy chọn)",
|
||||
"width": "Chiều rộng",
|
||||
"height": "Chiều cao",
|
||||
"rdpFootnote": "IronRDP gốc: TCP → X.224 → TLS → CredSSP/NLA → MCS; thời gian chờ bắt tay 45 giây. Việc xác minh chứng chỉ được nới lỏng trong quá trình phát triển.",
|
||||
"vncFootnote": "RFB vnc-rs gốc với giải mã Tight JPEG; clipboard được gửi dưới dạng UTF-8 (các máy chủ rất cũ có thể làm hỏng văn bản).",
|
||||
"errorHostRequired": "Nhập địa chỉ máy chủ",
|
||||
"errorUsernameRequired": "Nhập tên người dùng"
|
||||
},
|
||||
"toolbar": {
|
||||
"pasteClipboard": "Dán clipboard cục bộ sang máy từ xa",
|
||||
"pasteAria": "Dán sang máy từ xa",
|
||||
"shareDrive": "Sao chép một tệp cục bộ vào ổ đĩa dùng chung (Downloads cục bộ = Downloads từ xa trên OpsXShell)",
|
||||
"shareDriveAria": "Thêm vào ổ đĩa dùng chung",
|
||||
"openShareDir": "Mở thư mục dùng chung cục bộ (Downloads)",
|
||||
"openShareDirAria": "Mở thư mục dùng chung",
|
||||
"disconnect": "Ngắt kết nối",
|
||||
"disconnectAria": "Ngắt kết nối"
|
||||
},
|
||||
"status": {
|
||||
"connecting": "Đang kết nối…",
|
||||
"connected": "Đã kết nối",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"connectFailed": "Kết nối thất bại",
|
||||
"clipboardSynced": "Đã đồng bộ clipboard từ xa",
|
||||
"savedToDownloads": "Đã lưu vào Downloads cục bộ: {{name}}",
|
||||
"pastedToRemote": "Đã dán sang máy từ xa",
|
||||
"fileTooLarge": "Giới hạn mỗi tệp là 50MB",
|
||||
"fileShared": "Đã thêm vào Downloads dùng chung: {{name}} (hiển thị trên This PC từ xa)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"code": {
|
||||
"1000": "Kết nối thất bại. Kiểm tra mạng hoặc địa chỉ máy chủ.",
|
||||
"1001": "Kết nối đã hết thời gian chờ. Kiểm tra mạng hoặc thử lại sau.",
|
||||
"1002": "Xác thực thất bại. Kiểm tra tên người dùng và mật khẩu.",
|
||||
"1003": "Không thể tiếp cận máy chủ. Kiểm tra cài đặt mạng.",
|
||||
"1004": "Kết nối đã đóng",
|
||||
"1100": "Không thể tạo terminal",
|
||||
"1101": "Thực thi lệnh thất bại",
|
||||
"1102": "Thiết lập chuyển tiếp cổng thất bại",
|
||||
"1200": "Kết nối SFTP thất bại",
|
||||
"1201": "Không tìm thấy tệp",
|
||||
"1202": "Không đủ quyền cho tệp hoặc thư mục này",
|
||||
"1203": "Truyền tệp thất bại",
|
||||
"1204": "Không thể đọc nội dung thư mục",
|
||||
"1300": "Không tìm thấy phiên",
|
||||
"1301": "Không thể lưu phiên",
|
||||
"1302": "Không thể tải phiên",
|
||||
"1400": "Định dạng địa chỉ máy chủ không hợp lệ",
|
||||
"1401": "Cổng phải nằm trong khoảng từ 1 đến 65535",
|
||||
"1402": "Định dạng thông tin xác thực không hợp lệ",
|
||||
"9000": "Đã xảy ra lỗi không xác định",
|
||||
"9001": "Lỗi giao tiếp nội bộ",
|
||||
"9002": "Lỗi hệ thống tệp",
|
||||
"9003": "Lỗi mạng"
|
||||
},
|
||||
"action": {
|
||||
"retry": "Thử lại",
|
||||
"reconnect": "Kết nối lại",
|
||||
"ignore": "Bỏ qua",
|
||||
"exit": "Thoát",
|
||||
"none": "Không"
|
||||
},
|
||||
"connection": {
|
||||
"failed": "Kết nối thất bại. Kiểm tra mạng hoặc địa chỉ máy chủ.",
|
||||
"timeout": "Kết nối đã hết thời gian chờ. Kiểm tra mạng hoặc thử lại sau.",
|
||||
"authFailed": "Xác thực thất bại. Kiểm tra tên người dùng và mật khẩu.",
|
||||
"hostUnreachable": "Không thể tiếp cận máy chủ. Kiểm tra cài đặt mạng.",
|
||||
"closed": "Kết nối đã đóng",
|
||||
"dnsFailed": "Không thể phân giải máy chủ",
|
||||
"refused": "Kết nối bị từ chối",
|
||||
"disconnected": "Đã ngắt kết nối"
|
||||
},
|
||||
"auth": {
|
||||
"failed": "Xác thực thất bại. Kiểm tra tên người dùng và mật khẩu.",
|
||||
"invalidCredentials": "Định dạng thông tin xác thực không hợp lệ",
|
||||
"keyLoadFailed": "Không thể tải khóa riêng",
|
||||
"passphraseRequired": "Khóa riêng yêu cầu cụm mật khẩu",
|
||||
"passphraseWrong": "Cụm mật khẩu khóa riêng không đúng"
|
||||
},
|
||||
"shell": {
|
||||
"createFailed": "Không thể tạo terminal",
|
||||
"execFailed": "Thực thi lệnh thất bại",
|
||||
"localCreateFailed": "Không thể tạo shell cục bộ",
|
||||
"remoteCreateFailed": "Không thể tạo shell từ xa"
|
||||
},
|
||||
"proxy": {
|
||||
"connectFailed": "Kết nối proxy thất bại",
|
||||
"authFailed": "Xác thực proxy thất bại",
|
||||
"tunnelFailed": "Không thể thiết lập đường hầm proxy",
|
||||
"unsupported": "Loại proxy không được hỗ trợ",
|
||||
"jumpFailed": "Kết nối jump host thất bại",
|
||||
"hostRequired": "Bắt buộc có máy chủ proxy",
|
||||
"hostNoSpaces": "Máy chủ proxy không được chứa khoảng trắng",
|
||||
"portRequired": "Cổng proxy phải lớn hơn 0",
|
||||
"portTooHigh": "Cổng proxy không được vượt quá 65535"
|
||||
},
|
||||
"forward": {
|
||||
"failed": "Thiết lập chuyển tiếp cổng thất bại",
|
||||
"bindFailed": "Không thể ràng buộc cổng",
|
||||
"alreadyInUse": "Cổng đã được sử dụng"
|
||||
},
|
||||
"sftp": {
|
||||
"connectFailed": "Kết nối SFTP thất bại",
|
||||
"fileNotFound": "Không tìm thấy tệp",
|
||||
"permissionDenied": "Không đủ quyền cho tệp hoặc thư mục này",
|
||||
"transferFailed": "Truyền tệp thất bại",
|
||||
"listFailed": "Không thể đọc nội dung thư mục",
|
||||
"readFailed": "Đọc thất bại",
|
||||
"writeFailed": "Lưu thất bại",
|
||||
"renameFailed": "Đổi tên thất bại",
|
||||
"chmodFailed": "Không thể cập nhật quyền",
|
||||
"apiUnavailable": "API SFTP không khả dụng"
|
||||
},
|
||||
"session": {
|
||||
"notFound": "Không tìm thấy phiên",
|
||||
"saveFailed": "Không thể lưu phiên",
|
||||
"loadFailed": "Không thể tải phiên",
|
||||
"readConfigFailed": "Không thể đọc cấu hình phiên",
|
||||
"exportWriteFailed": "Không thể ghi tệp xuất",
|
||||
"exportFailed": "Xuất phiên thất bại",
|
||||
"importReadFailed": "Không thể đọc tệp",
|
||||
"importFailed": "Nhập phiên thất bại",
|
||||
"importEmpty": "Không tìm thấy phiên nào có thể nhập"
|
||||
},
|
||||
"validation": {
|
||||
"invalidHost": "Định dạng địa chỉ máy chủ không hợp lệ",
|
||||
"invalidPort": "Cổng phải nằm trong khoảng từ 1 đến 65535",
|
||||
"invalidCredentials": "Định dạng thông tin xác thực không hợp lệ",
|
||||
"hostRequired": "Nhập địa chỉ máy chủ",
|
||||
"usernameRequired": "Nhập tên người dùng",
|
||||
"targetRequired": "Nhập máy chủ, vd. root@192.168.1.10 hoặc opsbase.cn:5555",
|
||||
"serialPathRequired": "Nhập đường dẫn thiết bị serial",
|
||||
"taskRequired": "Nhập một tác vụ hoặc theo dõi"
|
||||
},
|
||||
"filesystem": {
|
||||
"error": "Lỗi hệ thống tệp",
|
||||
"readFailed": "Không thể đọc tệp",
|
||||
"writeFailed": "Không thể ghi tệp"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Không thể đọc clipboard",
|
||||
"writeFailed": "Không thể ghi clipboard",
|
||||
"copyPathFailed": "Không thể sao chép đường dẫn",
|
||||
"unsupportedRead": "Việc đọc clipboard không được hỗ trợ trong môi trường này",
|
||||
"unsupportedWrite": "Việc ghi clipboard không được hỗ trợ trong môi trường này"
|
||||
},
|
||||
"ipc": {
|
||||
"error": "Lỗi giao tiếp nội bộ",
|
||||
"nativeApiUnavailable": "API gốc không khả dụng"
|
||||
},
|
||||
"network": {
|
||||
"error": "Lỗi mạng"
|
||||
},
|
||||
"pool": {
|
||||
"limitReached": "Đã đạt giới hạn kết nối ({{max}}). Hãy đóng bớt kết nối trước."
|
||||
},
|
||||
"desktop": {
|
||||
"connectFailed": "Kết nối thất bại",
|
||||
"fileTooLarge": "Giới hạn mỗi tệp là 50MB",
|
||||
"nativeOnly": "Kết nối từ xa chỉ khả dụng trong ứng dụng desktop Tauri OpsXShell",
|
||||
"rdpNativeOnly": "RDP chỉ khả dụng trong ứng dụng desktop Tauri OpsXShell",
|
||||
"vncNativeOnly": "VNC chỉ khả dụng trong ứng dụng desktop Tauri OpsXShell"
|
||||
},
|
||||
"serial": {
|
||||
"openFailed": "Không thể mở cổng serial",
|
||||
"writeFailed": "Ghi serial thất bại",
|
||||
"nativeOnly": "Cổng serial chỉ khả dụng trong ứng dụng desktop Tauri"
|
||||
},
|
||||
"ai": {
|
||||
"noProvider": "Cấu hình nhà cung cấp AI trong Cài đặt → AI trước tiên",
|
||||
"noApiKey": "Chưa lưu API key cho \"{{provider}}\"",
|
||||
"modelEmpty": "Mô hình không trả về nội dung nào",
|
||||
"protocolFailed": "Mô hình thất bại giao thức công cụ hai lần; đã dừng",
|
||||
"noConclusion": "Mô hình không trả về kết luận dùng được",
|
||||
"multipleCommands": "Mô hình trả về nhiều lệnh; từ chối thực thi",
|
||||
"invalidCommand": "Mô hình không trả về một lệnh một dòng duy nhất; từ chối thực thi",
|
||||
"repeatLoop": "Phát hiện vòng lặp lệnh lặp lại; đã dừng: {{command}}",
|
||||
"criticalBlocked": "Lệnh gặp chặn cứng phá hủy; không có ghi đè: {{command}}",
|
||||
"execFailed": "ssh-exec thất bại: {{error}}",
|
||||
"maxSteps": "Đã đạt giới hạn {{max}} bước; thu hẹp phạm vi và thử lại",
|
||||
"sshRequired": "Cần một phiên SSH từ xa đã kết nối"
|
||||
},
|
||||
"zmodem": {
|
||||
"readFailed": "Đọc thất bại: {{name}}",
|
||||
"writeFailed": "Ghi thất bại: {{name}}"
|
||||
},
|
||||
"unknown": {
|
||||
"error": "Đã xảy ra lỗi không xác định"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"connect": {
|
||||
"title": "Kết nối cổng serial",
|
||||
"description": "Terminal serial gốc · bộ định tuyến, bộ chuyển mạch, bo mạch và bảng điều khiển gỡ lỗi",
|
||||
"confirm": "Mở cổng",
|
||||
"device": "Thiết bị",
|
||||
"refresh": "Làm mới",
|
||||
"devicePlaceholder": "{{path}}",
|
||||
"noDevicesHint": "Nếu không có thiết bị nào được liệt kê, hãy nhập đường dẫn thủ công, vd. {{examples}}.",
|
||||
"examplesWindows": "{{default}}, COM3",
|
||||
"examplesLinux": "{{default}}, /dev/ttyACM0",
|
||||
"examplesMac": "{{default}}, /dev/tty.usbserial-*",
|
||||
"baudRate": "Tốc độ baud",
|
||||
"dataBits": "Bit dữ liệu",
|
||||
"stopBits": "Bit dừng",
|
||||
"parity": "Parity",
|
||||
"parityNone": "Không",
|
||||
"parityOdd": "Lẻ",
|
||||
"parityEven": "Chẵn",
|
||||
"flowControl": "Điều khiển luồng",
|
||||
"flowNone": "Không",
|
||||
"flowSoftware": "Phần mềm XON/XOFF",
|
||||
"flowHardware": "Phần cứng RTS/CTS",
|
||||
"lineEnding": "Kết thúc dòng",
|
||||
"lineEndingLf": "LF (\\n)",
|
||||
"lineEndingCr": "CR (\\r)",
|
||||
"lineEndingCrlf": "CRLF (\\r\\n)",
|
||||
"localEcho": "Echo cục bộ",
|
||||
"localEchoHint": "(gỡ lỗi bán song công)",
|
||||
"errorPathRequired": "Nhập đường dẫn thiết bị serial"
|
||||
},
|
||||
"terminal": {
|
||||
"title": "Serial",
|
||||
"connected": "Đã kết nối",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"connecting": "Đang kết nối…",
|
||||
"error": "Lỗi Serial",
|
||||
"configSummary": "{{path}} · {{baud}} · {{dataBits}}-{{parity}}-{{stopBits}}",
|
||||
"opening": "Đang mở {{path}} @ {{baud}}...",
|
||||
"openFailed": "Không thể mở cổng serial: {{message}}",
|
||||
"connectedBanner": "Đã kết nối {{path}} · {{baud}} {{frame}} · {{lineEnding}}{{echo}}",
|
||||
"localEchoSuffix": " · echo cục bộ"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
{
|
||||
"sidebar": {
|
||||
"quickConnect": "Kết nối nhanh",
|
||||
"quickConnectShort": "Kết nối",
|
||||
"newSession": "Phiên mới",
|
||||
"newSessionShort": "Mới",
|
||||
"searchPlaceholder": "Tìm phiên...",
|
||||
"batchMode": "Thao tác hàng loạt",
|
||||
"exitBatchMode": "Thoát chế độ hàng loạt",
|
||||
"batchSelected": "Đã chọn {{count}} SSH",
|
||||
"batchExcludedDesktop": " · loại trừ RDP/VNC",
|
||||
"selectAllVisible": "Chọn tất cả trong khung nhìn",
|
||||
"deselectAllVisible": "Bỏ chọn tất cả trong khung nhìn",
|
||||
"batchExec": "Thực thi hàng loạt",
|
||||
"settings": "Cài đặt",
|
||||
"resizeHint": "Kéo để đổi cỡ; nhấp đúp để thu gọn"
|
||||
},
|
||||
"tree": {
|
||||
"selectSession": "Chọn phiên",
|
||||
"noMatchTitle": "Không có phiên phù hợp",
|
||||
"noMatchDesc": "Thử từ khóa khác",
|
||||
"emptyTitle": "Chưa có phiên nào",
|
||||
"emptyDesc": "Kết nối nhanh hoặc tạo phiên; nhấp đúp để mở terminal",
|
||||
"emptyAction": "Phiên mới"
|
||||
},
|
||||
"contextMenu": {
|
||||
"blank": {
|
||||
"newGroup": "Nhóm mới",
|
||||
"newSession": "Phiên mới"
|
||||
},
|
||||
"group": {
|
||||
"newSessionHere": "Phiên mới tại đây",
|
||||
"newGroup": "Nhóm mới",
|
||||
"renameGroup": "Đổi tên nhóm",
|
||||
"deleteEmptyGroup": "Xóa nhóm rỗng"
|
||||
},
|
||||
"session": {
|
||||
"open": "Mở",
|
||||
"edit": "Sửa",
|
||||
"duplicate": "Nhân đôi",
|
||||
"delete": "Xóa"
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"default": "Mặc định",
|
||||
"new": {
|
||||
"title": "Nhóm mới",
|
||||
"message": "Nhập tên nhóm",
|
||||
"placeholder": "vd. Sản xuất",
|
||||
"confirm": "Tạo"
|
||||
},
|
||||
"rename": {
|
||||
"title": "Đổi tên nhóm",
|
||||
"message": "Đổi tên \"{{name}}\" thành",
|
||||
"placeholder": "Tên nhóm",
|
||||
"confirm": "Lưu"
|
||||
},
|
||||
"deleteBlocked": {
|
||||
"title": "Không thể xóa",
|
||||
"message": "Nhóm \"{{name}}\" vẫn còn phiên. Hãy di chuyển hoặc xóa chúng trước.",
|
||||
"confirm": "Đã hiểu"
|
||||
},
|
||||
"newOption": "Nhóm mới…",
|
||||
"hint": "Nhóm mặc định được sử dụng trừ khi bạn chọn hoặc tạo nhóm khác"
|
||||
},
|
||||
"deleteSession": {
|
||||
"title": "Xóa phiên",
|
||||
"message": "Xóa phiên \"{{name}}\"?",
|
||||
"confirm": "Xóa"
|
||||
},
|
||||
"welcome": {
|
||||
"tagline": "Terminal từ xa · SFTP · Chuyển tiếp cổng",
|
||||
"sectionStart": "Bắt đầu",
|
||||
"sectionDesktop": "Màn hình từ xa",
|
||||
"sectionRecent": "Phiên gần đây",
|
||||
"quickConnect": {
|
||||
"title": "Kết nối nhanh",
|
||||
"desc": "SSH dùng một lần; không lưu vào thư viện"
|
||||
},
|
||||
"newSession": {
|
||||
"title": "Phiên mới",
|
||||
"desc": "Lưu máy chủ; nhấp đúp trong thanh bên để kết nối"
|
||||
},
|
||||
"localShell": {
|
||||
"title": "Shell cục bộ",
|
||||
"selectShell": "Chọn shell",
|
||||
"default": "Mặc định"
|
||||
},
|
||||
"rdp": {
|
||||
"title": "Màn hình từ xa RDP",
|
||||
"desc": "Windows · NLA / CredSSP"
|
||||
},
|
||||
"vnc": {
|
||||
"title": "Màn hình từ xa VNC",
|
||||
"desc": "RFB · phiên đồ họa đa nền tảng"
|
||||
},
|
||||
"recentEmpty": {
|
||||
"title": "Chưa có phiên đã lưu",
|
||||
"desc": "Thử kết nối nhanh, hoặc tạo phiên để dùng lại sau"
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"searchPlaceholder": "Tìm máy chủ, nhóm, hoặc tab"
|
||||
},
|
||||
"quickConnect": {
|
||||
"title": "Kết nối nhanh",
|
||||
"target": "Đích",
|
||||
"targetPlaceholder": "root@192.168.1.10:22",
|
||||
"targetHint": "Hỗ trợ máy chủ, người_dùng@máy_chủ, người_dùng@máy_chủ:cổng",
|
||||
"password": "Mật khẩu",
|
||||
"passwordOptional": "Tùy chọn · để trống khi dùng khóa",
|
||||
"connect": "Kết nối",
|
||||
"errorInvalidTarget": "Nhập máy chủ, vd. root@192.168.1.10 hoặc opsbase.cn:5555",
|
||||
"errorConnectFailed": "Kết nối thất bại"
|
||||
},
|
||||
"dialog": {
|
||||
"create": "Phiên mới",
|
||||
"edit": "Sửa phiên",
|
||||
"subtitle": "Đích một dòng · tùy chọn nâng cao đã thu gọn",
|
||||
"saving": "Đang lưu…",
|
||||
"save": "Lưu",
|
||||
"createAndSave": "Tạo và lưu",
|
||||
"basic": "Cơ bản",
|
||||
"login": "Đăng nhập",
|
||||
"advanced": "Nâng cao",
|
||||
"advancedCollapsed": "Proxy · jump host · thẻ",
|
||||
"collapse": "Thu gọn",
|
||||
"protocol": "Giao thức",
|
||||
"displayName": "Tên hiển thị (tùy chọn)",
|
||||
"displayNamePlaceholder": "Mặc định là người_dùng@máy_chủ hoặc vnc:máy_chủ",
|
||||
"host": "Máy chủ",
|
||||
"hostPlaceholder": "192.168.1.10",
|
||||
"hostHint": "IP hoặc tên máy chủ; cũng chấp nhận máy_chủ:cổng",
|
||||
"port": "Cổng",
|
||||
"username": "Tên người dùng",
|
||||
"usernamePlaceholderRdp": "Administrator",
|
||||
"usernamePlaceholderSsh": "root",
|
||||
"width": "Chiều rộng",
|
||||
"height": "Chiều cao",
|
||||
"group": "Nhóm",
|
||||
"authPassword": "Mật khẩu",
|
||||
"authKey": "Khóa",
|
||||
"password": "Mật khẩu",
|
||||
"domain": "Tên miền (tùy chọn)",
|
||||
"domainPlaceholder": "Hiếm khi cần trừ khi dùng tài khoản miền",
|
||||
"keySource": "Nguồn khóa",
|
||||
"keyFile": "Tệp",
|
||||
"keyText": "Văn bản",
|
||||
"privateKeyPath": "Đường dẫn khóa riêng",
|
||||
"privateKeyText": "Văn bản khóa riêng",
|
||||
"privateKeyTextHint": "Khóa được dán vào sẽ được mã hóa trên đĩa như mật khẩu",
|
||||
"pickKeyFile": "Duyệt…",
|
||||
"pickKeyDialogTitle": "Chọn tệp khóa riêng",
|
||||
"allFilesFilter": "Tất cả tệp",
|
||||
"passphrase": "Cụm mật khẩu khóa (tùy chọn)",
|
||||
"passphrasePlaceholder": "Tùy chọn",
|
||||
"tags": "Thẻ",
|
||||
"tagsPlaceholder": "prod, web",
|
||||
"startupCommand": "Lệnh khởi động (tùy chọn)",
|
||||
"startupCommandPlaceholder": "Chạy sau khi kết nối, vd. cd /var/log",
|
||||
"proxy": "Proxy",
|
||||
"proxyNone": "Không",
|
||||
"proxyHostPlaceholder": "Máy chủ proxy",
|
||||
"proxyPortPlaceholder": "Cổng",
|
||||
"proxyUserPlaceholder": "Tên người dùng (tùy chọn)",
|
||||
"proxyPasswordPlaceholder": "Mật khẩu (tùy chọn)",
|
||||
"jumpHost": "Jump host (tùy chọn)",
|
||||
"jumpNone": "Không có jump host",
|
||||
"jumpNoneAlt": "Không có jump host",
|
||||
"jumpHint": "Một phiên đã lưu có thể được dùng làm jump host"
|
||||
},
|
||||
"batch": {
|
||||
"title": "Thực thi hàng loạt",
|
||||
"subtitle": "Đã chọn {{selected}} · đồng thời {{concurrency}} · kết quả bị hủy khi đóng tab",
|
||||
"dialogTitle": "Lệnh hàng loạt",
|
||||
"dialogDesc": "Đã chọn {{selected}}/{{total}} máy chủ · đồng thời tối đa {{concurrency}}",
|
||||
"targetCount": "{{count}} đích",
|
||||
"runningProgress": "Đang chạy {{completed}}/{{total}}",
|
||||
"execute": "Chạy trên {{count}} máy chủ",
|
||||
"executeAgain": "Chạy lại",
|
||||
"success": "{{count}} thành công",
|
||||
"failed": "{{count}} thất bại",
|
||||
"command": "Lệnh từ xa",
|
||||
"commandPlaceholder": "vd. uptime",
|
||||
"targets": "Máy chủ đích",
|
||||
"filterPlaceholder": "Tên, IP, nhóm, hoặc thẻ",
|
||||
"filterAria": "Lọc máy chủ",
|
||||
"noMatchHosts": "Không có máy chủ phù hợp",
|
||||
"resultMatrix": "Ma trận kết quả",
|
||||
"resultMatrixHint": "Máy chủ × trạng thái × đầu ra",
|
||||
"emptySelection": "Chọn đích ở bên trái, hoặc mở từ chế độ hàng loạt thanh bên với lựa chọn",
|
||||
"noOutput": "(không có đầu ra)",
|
||||
"errorReadConfig": "Không thể đọc cấu hình phiên",
|
||||
"errorConnectFailed": "Kết nối thất bại",
|
||||
"errorExecFailed": "Thực thi lệnh thất bại",
|
||||
"results": "Kết quả",
|
||||
"resultsHint": "Đầu ra chỉ được giữ trong hộp thoại này",
|
||||
"ctrlEnterHint": "Ctrl/⌘ + Enter để chạy",
|
||||
"executeTo": "Chạy trên {{count}} máy chủ",
|
||||
"selectFromLeft": "Chọn đích ở bên trái"
|
||||
},
|
||||
"importExport": {
|
||||
"exportTitle": "Xuất phiên",
|
||||
"exportDefaultPath": "opsxshell-sessions.bak",
|
||||
"exportFilterBak": "Sao lưu OpsXShell",
|
||||
"exportFilterJson": "JSON",
|
||||
"exportSuccess": "Đã xuất {{count}} phiên tới:\n{{path}}",
|
||||
"exportWriteFailed": "Không thể ghi tệp xuất",
|
||||
"exportFailed": "Xuất phiên thất bại",
|
||||
"exportFailedDetail": "Xuất phiên thất bại: {{message}}",
|
||||
"exportPasswordTitle": "Đặt mật khẩu sao lưu",
|
||||
"exportPasswordMessage": "Tệp xuất sẽ mã hóa nhóm máy chủ, khóa riêng, mật khẩu và các thông tin bí mật khác. Hãy chọn mật khẩu sao lưu.",
|
||||
"exportPasswordPlaceholder": "Nhập mật khẩu sao lưu",
|
||||
"exportPasswordConfirmTitle": "Xác nhận mật khẩu sao lưu",
|
||||
"exportPasswordConfirmMessage": "Nhập lại mật khẩu sao lưu để xác nhận.",
|
||||
"exportPasswordConfirmPlaceholder": "Nhập lại mật khẩu sao lưu",
|
||||
"exportPasswordMismatch": "Mật khẩu không khớp",
|
||||
"exportPasswordRequired": "Cần mật khẩu sao lưu để xuất",
|
||||
"importTitle": "Nhập phiên",
|
||||
"importFilterBak": "Sao lưu OpsXShell",
|
||||
"importFilterJson": "JSON",
|
||||
"importFilterSshConfig": "SSH Config",
|
||||
"importFilterAll": "Tất cả tệp",
|
||||
"readFileFailed": "Không thể đọc tệp",
|
||||
"readFileFailedDetail": "Không thể đọc tệp: {{message}}",
|
||||
"importPasswordTitle": "Nhập mật khẩu sao lưu",
|
||||
"importPasswordMessage": "Tệp này được mã hóa. Nhập mật khẩu đã đặt khi xuất để nhập nhóm máy chủ và thông tin xác thực.",
|
||||
"importPasswordPlaceholder": "Nhập mật khẩu sao lưu",
|
||||
"importPasswordRequired": "Cần mật khẩu để nhập bản sao lưu được mã hóa",
|
||||
"importPasswordInvalid": "Mật khẩu sao lưu sai, hoặc tệp bị hỏng",
|
||||
"noSessionsFound": "Không tìm thấy phiên nào có thể nhập",
|
||||
"noValidSessions": "Không có mục phiên hợp lệ trong tệp",
|
||||
"importSuccess": "Đã nhập {{created}}/{{total}} phiên",
|
||||
"importFailed": "Nhập phiên thất bại",
|
||||
"importFailedDetail": "Nhập phiên thất bại: {{message}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"nav": {
|
||||
"general": "Không gian làm việc",
|
||||
"generalDesc": "Bố cục và tài nguyên",
|
||||
"appearance": "Giao diện",
|
||||
"appearanceDesc": "Chủ đề và ngôn ngữ",
|
||||
"terminal": "Terminal",
|
||||
"terminalDesc": "Phông chữ và màu sắc",
|
||||
"shortcuts": "Phím tắt",
|
||||
"shortcutsDesc": "Tổ hợp phím",
|
||||
"ssh": "SSH",
|
||||
"sshDesc": "Kết nối và pool",
|
||||
"security": "Bảo mật",
|
||||
"securityDesc": "Thông tin xác thực và khóa máy chủ",
|
||||
"ai": "Mô hình AI",
|
||||
"aiDesc": "Nhà cung cấp AI",
|
||||
"about": "Giới thiệu",
|
||||
"aboutDesc": "Phiên bản và dữ liệu"
|
||||
},
|
||||
"title": "Cài đặt",
|
||||
"search": {
|
||||
"placeholder": "Tìm cài đặt..."
|
||||
},
|
||||
"language": {
|
||||
"label": "Ngôn ngữ",
|
||||
"description": "Áp dụng ngay lập tức",
|
||||
"zhCN": "简体中文",
|
||||
"zhTW": "繁體中文",
|
||||
"en": "English",
|
||||
"ja": "日本語",
|
||||
"ko": "한국어",
|
||||
"vi": "Tiếng Việt",
|
||||
"ru": "Русский"
|
||||
},
|
||||
"general": {
|
||||
"layout": "Bố cục không gian làm việc",
|
||||
"sidebarWidth": "Chiều rộng thanh bên",
|
||||
"sidebarWidthDesc": "Chiều rộng mặc định của thanh bên phiên",
|
||||
"collapseSidebar": "Thu gọn thanh bên",
|
||||
"collapseSidebarDesc": "Ẩn cây phiên để tập trung vào terminal; bật/tắt bằng Ctrl/Cmd+B"
|
||||
},
|
||||
"appearance": {
|
||||
"themeGroup": "Chủ đề",
|
||||
"theme": "Chủ đề",
|
||||
"themeDesc": "Màu sắc giao diện ứng dụng (độc lập với màu terminal)",
|
||||
"dark": "Tối",
|
||||
"light": "Sáng",
|
||||
"system": "Hệ thống"
|
||||
},
|
||||
"terminal": {
|
||||
"fontGroup": "Phông chữ và cỡ chữ",
|
||||
"fontFamily": "Phông chữ",
|
||||
"fontFamilyDesc": "Dùng Nerd Font cho biểu tượng prompt Zsh",
|
||||
"fontSize": "Cỡ chữ",
|
||||
"fontSizeDesc": "Cỡ chữ terminal",
|
||||
"scrollback": "Bộ đệm cuộn",
|
||||
"scrollbackDesc": "Số dòng lịch sử được giữ lại cho mỗi terminal",
|
||||
"keywordHighlight": "Tô sáng từ khóa",
|
||||
"keywordHighlightDesc": "Tô sáng lỗi, cảnh báo và trạng thái thành công",
|
||||
"colorTheme": "Chủ đề màu"
|
||||
},
|
||||
"shortcuts": {
|
||||
"resetAll": "Đặt lại tất cả về mặc định",
|
||||
"custom": "Tùy chỉnh",
|
||||
"pressKeys": "Nhấn phím...",
|
||||
"resetDefault": "Đặt lại về mặc định",
|
||||
"conflict": "Xung đột với \"{{label}}\"",
|
||||
"setTo": "Đặt thành {{keys}}",
|
||||
"hint": "Nhấp vào một phím tắt để gán lại · Esc để hủy",
|
||||
"category": {
|
||||
"tabs": "Tab",
|
||||
"view": "Hiển thị",
|
||||
"session": "Phiên",
|
||||
"tools": "Công cụ"
|
||||
},
|
||||
"actions": {
|
||||
"tabNext": "Tab kế tiếp",
|
||||
"tabPrev": "Tab trước đó",
|
||||
"tabGotoN": "Đi tới tab N",
|
||||
"tabClose": "Đóng tab hiện tại",
|
||||
"tabNew": "Tab mới",
|
||||
"viewFullscreen": "Bật/tắt toàn màn hình",
|
||||
"viewToggleSidebar": "Bật/tắt thanh bên",
|
||||
"sessionNew": "Phiên mới",
|
||||
"sessionQuickConnect": "Kết nối nhanh",
|
||||
"toolsCommandPalette": "Bảng lệnh"
|
||||
}
|
||||
},
|
||||
"ssh": {
|
||||
"connection": "Kết nối",
|
||||
"keepAlive": "Keep-alive",
|
||||
"keepAliveDesc": "Gửi keep-alive khi nhàn rỗi để giảm ngắt kết nối",
|
||||
"autoReconnect": "Tự động kết nối lại",
|
||||
"autoReconnectDesc": "Tự động thử lại sau khi ngắt kết nối bất ngờ",
|
||||
"timeout": "Thời gian chờ kết nối",
|
||||
"timeoutDesc": "Thời gian chờ tối đa khi thiết lập SSH (giây)",
|
||||
"maxReconnect": "Số lần kết nối lại",
|
||||
"maxReconnectDesc": "Số lần thử lại tối đa sau khi ngắt kết nối bất ngờ",
|
||||
"pool": "Pool kết nối",
|
||||
"maxConnections": "Số kết nối tối đa",
|
||||
"maxConnectionsDesc": "Giới hạn dùng chung cho kết nối SSH, SFTP và hàng loạt",
|
||||
"maxBackground": "Giới hạn kết nối chạy nền",
|
||||
"maxBackgroundDesc": "Loại bỏ các kết nối ít dùng gần nhất khi vượt quá giới hạn",
|
||||
"suspend": "Tạm dừng ở nền",
|
||||
"suspendDesc": "Số phút trước khi giải phóng các kênh đang hoạt động khi một tab chạy nền"
|
||||
},
|
||||
"security": {
|
||||
"credentials": "Bảo vệ thông tin xác thực",
|
||||
"sessionPassword": "Mật khẩu phiên và cụm mật khẩu khóa",
|
||||
"sessionPasswordDesc": "Được mã hóa bằng AES-256-GCM trong Rust trước khi lưu; không thể tắt",
|
||||
"enabled": "Đã bật",
|
||||
"masterKey": "Khóa chính cục bộ",
|
||||
"masterKeyDesc": "Chỉ người dùng hệ thống hiện tại mới có thể đọc; đường dẫn ~/.opsxshell/master.key (đường dẫn cũ ~/.opsxshsell được chuyển tự động)",
|
||||
"knownHosts": "Máy chủ đã biết",
|
||||
"knownHostsHint": "Lần kết nối đầu tiên sẽ nhắc xác nhận dấu vết máy chủ. Nếu việc cài lại hoặc nhân bản làm thay đổi khóa, hãy chọn “Tin tưởng và cập nhật” trong lời nhắc để thay thế bản ghi cũ. Xóa từng mục hoặc xóa tất cả tại đây.",
|
||||
"clearAll": "Xóa tất cả",
|
||||
"removeHost": "Xóa bản ghi máy chủ này",
|
||||
"empty": "Không có bản ghi",
|
||||
"clearConfirm": "Xóa tất cả khóa máy chủ đã biết? Bạn sẽ được nhắc lại vào lần kết nối sau."
|
||||
},
|
||||
"about": {
|
||||
"tagline": "Terminal vận hành SSH / SFTP gốc, nhẹ",
|
||||
"appVersion": "Ứng dụng v{{version}}",
|
||||
"copyVersion": "Sao chép thông tin phiên bản",
|
||||
"runtime": "Runtime",
|
||||
"system": "Hệ thống",
|
||||
"localData": "Dữ liệu cục bộ",
|
||||
"sessionsSettings": "Phiên và cài đặt",
|
||||
"masterKeyPath": "Khóa chính",
|
||||
"privacyNote": "Mật khẩu và cụm mật khẩu khóa được mã hóa bằng AES-256-GCM trong Rust. OpsXShell không lưu lịch sử lệnh terminal.",
|
||||
"license": "Giấy phép MIT · Rust · XTerm.js"
|
||||
},
|
||||
"ai": {
|
||||
"presets": "Cài sẵn nhà cung cấp",
|
||||
"add": "Thêm",
|
||||
"configured": "Đã cấu hình",
|
||||
"configuredHint": "Chọn nhà cung cấp và nhấn Thêm",
|
||||
"emptyHint": "Thêm nhà cung cấp để bắt đầu",
|
||||
"noModel": "Chưa chọn mô hình",
|
||||
"name": "Tên",
|
||||
"model": "Mô hình",
|
||||
"protocol": "Giao thức",
|
||||
"auth": "Xác thực",
|
||||
"authNone": "Không",
|
||||
"test": "Kiểm tra",
|
||||
"testing": "Đang kiểm tra",
|
||||
"testingMessage": "Đang kiểm tra...",
|
||||
"saved": "Đã lưu",
|
||||
"retest": "Vui lòng kiểm tra lại",
|
||||
"testFailed": "Kiểm tra kết nối thất bại",
|
||||
"available": "OK · {{latency}} ms",
|
||||
"savedKeepBlank": "Đã lưu — để trống để giữ nguyên",
|
||||
"notRequired": "Không bắt buộc",
|
||||
"otherModels": "Các mô hình khác…",
|
||||
"customModel": "Mô hình tùy chỉnh",
|
||||
"backToList": "Quay lại danh sách",
|
||||
"apiKeyOptional": "API Key (không bắt buộc)",
|
||||
"advanced": "Nâng cao",
|
||||
"allowHttp": "Cho phép HTTP (localhost/LAN)",
|
||||
"setActive": "Đặt làm hoạt động",
|
||||
"deleteTitle": "Xóa",
|
||||
"apiKeySaveFailed": "Không thể lưu API key",
|
||||
"providerNotFound": "Không tìm thấy nhà cung cấp",
|
||||
"modelCatalogReadFailed": "Không thể đọc danh mục mô hình",
|
||||
"catalogUnavailable": "models.dev không khả dụng"
|
||||
},
|
||||
"family": {
|
||||
"openai_compatible": "Tương thích OpenAI",
|
||||
"standalone": "────────",
|
||||
"plan": "Gói",
|
||||
"local": "Tự lưu trú",
|
||||
"custom": "Tùy chỉnh"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"panel": {
|
||||
"local": "Cục bộ",
|
||||
"remote": "Từ xa",
|
||||
"notConnectedTitle": "Chưa kết nối tới máy chủ từ xa",
|
||||
"notConnectedDesc": "Kết nối một phiên SSH trước để dùng SFTP",
|
||||
"ariaLabel": "Bảng tệp {{title}}"
|
||||
},
|
||||
"connection": {
|
||||
"selectServer": "Chọn máy chủ",
|
||||
"noSessions": "Chưa có phiên đã lưu",
|
||||
"createSessionHint": "Tạo phiên trong thanh bên trước tiên",
|
||||
"reconnect": "Kết nối lại",
|
||||
"notConnected": "Chưa kết nối",
|
||||
"connecting": "Đang kết nối..."
|
||||
},
|
||||
"errors": {
|
||||
"notConnected": "SFTP chưa được kết nối",
|
||||
"noUploadFiles": "Không có tệp để tải lên",
|
||||
"localStatFailed": "Không thể đọc thông tin tệp cục bộ",
|
||||
"loadRemoteFailed": "Không thể tải thư mục từ xa: {{message}}",
|
||||
"noFolderDownload": "Không thể tải xuống thư mục",
|
||||
"selectDownloadFiles": "Chọn tệp để tải xuống trước",
|
||||
"uploadFailed": "Tải lên thất bại",
|
||||
"downloadFailed": "Tải xuống thất bại",
|
||||
"fileError": "{{fileName}}: {{message}}"
|
||||
},
|
||||
"toolbar": {
|
||||
"upload": "Tải lên",
|
||||
"uploadAria": "Tải lên",
|
||||
"download": "Tải xuống",
|
||||
"downloadAria": "Tải xuống",
|
||||
"downloadNeedSelection": "Chọn tệp từ xa trước",
|
||||
"downloadHint": "Tải xuống các tệp từ xa đã chọn",
|
||||
"refresh": "Làm mới",
|
||||
"refreshAria": "Làm mới",
|
||||
"newFolder": "Thư mục mới",
|
||||
"newFolderAria": "Thư mục mới"
|
||||
},
|
||||
"sort": {
|
||||
"name": "Tên",
|
||||
"modified": "Đã sửa đổi",
|
||||
"size": "Kích thước",
|
||||
"type": "Loại"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Trang chính",
|
||||
"back": "Lùi",
|
||||
"forward": "Tiến",
|
||||
"up": "Lên",
|
||||
"searchPlaceholder": "Tìm tên tệp",
|
||||
"clearSearch": "Xóa tìm kiếm",
|
||||
"clearSearchAria": "Xóa tìm kiếm",
|
||||
"showHidden": "Hiển thị tệp ẩn",
|
||||
"hideHidden": "Ẩn tệp chấm (.xxx)",
|
||||
"showHiddenAria": "Hiển thị tệp ẩn",
|
||||
"hideHiddenAria": "Ẩn tệp chấm",
|
||||
"searchAria": "Tìm trong {{title}}"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Đang tải...",
|
||||
"selected": "Đã chọn {{count}}",
|
||||
"filtered": "Hiển thị {{shown}} / {{total}}",
|
||||
"hiddenCount": "{{total}} mục ({{hidden}} ẩn)",
|
||||
"total": "{{count}} mục",
|
||||
"filterHint": "Lọc: {{query}}"
|
||||
},
|
||||
"empty": {
|
||||
"dirTitle": "Thư mục rỗng",
|
||||
"dirDescLocal": "Không có tệp trong thư mục này",
|
||||
"dirDescRemote": "Thử đi lên hoặc làm mới",
|
||||
"goUp": "Đi lên",
|
||||
"hiddenOnlyTitle": "Chỉ có tệp ẩn",
|
||||
"hiddenOnlyDesc": "Nhấn vào biểu tượng con mắt trong tiêu đề để hiển thị tệp chấm",
|
||||
"showHiddenAction": "Hiển thị tệp ẩn",
|
||||
"noMatchTitle": "Không có tệp phù hợp",
|
||||
"noMatchDesc": "Không có tệp khớp với \"{{query}}\""
|
||||
},
|
||||
"fileType": {
|
||||
"folder": "Thư mục",
|
||||
"symlink": "Liên kết",
|
||||
"symlinkLong": "Liên kết tượng trưng",
|
||||
"file": "Tệp",
|
||||
"text": "Văn bản",
|
||||
"log": "Nhật ký",
|
||||
"database": "Cơ sở dữ liệu",
|
||||
"imageIso": "Ảnh đĩa",
|
||||
"executable": "Tệp thực thi",
|
||||
"library": "Thư viện"
|
||||
},
|
||||
"relativeDate": {
|
||||
"today": "Hôm nay",
|
||||
"yesterday": "Hôm qua",
|
||||
"daysAgo": "{{count}} ngày trước"
|
||||
},
|
||||
"contextMenu": {
|
||||
"open": "Mở",
|
||||
"upload": "Tải lên",
|
||||
"download": "Tải xuống",
|
||||
"edit": "Sửa",
|
||||
"rename": "Đổi tên",
|
||||
"copyPath": "Sao chép đường dẫn",
|
||||
"properties": "Thuộc tính",
|
||||
"permissions": "Quyền",
|
||||
"delete": "Xóa"
|
||||
},
|
||||
"dialog": {
|
||||
"renameTitle": "Đổi tên",
|
||||
"renameMessage": "Nhập tên mới:",
|
||||
"renamePlaceholder": "Tên mới",
|
||||
"newFolderTitle": "Thư mục mới",
|
||||
"newFolderMessage": "Nhập tên thư mục:",
|
||||
"newFolderPlaceholder": "Tên thư mục",
|
||||
"propertiesTitle": "Thuộc tính tệp",
|
||||
"propertiesClose": "Đóng",
|
||||
"chmodTitle": "Sửa quyền",
|
||||
"chmodApply": "Áp dụng",
|
||||
"pickUploadTitle": "Chọn tệp hoặc thư mục để tải lên",
|
||||
"pickUploadRzTitle": "Chọn tệp để tải lên (rz)"
|
||||
},
|
||||
"properties": {
|
||||
"name": "Tên",
|
||||
"path": "Đường dẫn",
|
||||
"size": "Kích thước",
|
||||
"permissions": "Quyền",
|
||||
"modified": "Đã sửa đổi",
|
||||
"accessed": "Đã truy cập",
|
||||
"symlink": "Liên kết tượng trưng",
|
||||
"loadingDetails": "Đang tải chi tiết..."
|
||||
},
|
||||
"chmod": {
|
||||
"read": "Đọc",
|
||||
"write": "Ghi",
|
||||
"execute": "Thực thi",
|
||||
"owner": "Chủ sở hữu",
|
||||
"group": "Nhóm",
|
||||
"other": "Khác",
|
||||
"current": "Chế độ hiện tại:",
|
||||
"readR": "Đọc (r)",
|
||||
"writeW": "Ghi (w)",
|
||||
"executeX": "Thực thi (x)"
|
||||
},
|
||||
"transfer": {
|
||||
"queue": "Hàng đợi truyền",
|
||||
"active": "{{count}} đang chạy",
|
||||
"completed": "{{count}} hoàn tất",
|
||||
"taskCount": "{{count}} tác vụ",
|
||||
"empty": "Không có tác vụ truyền",
|
||||
"cancel": "Hủy",
|
||||
"remove": "Xóa",
|
||||
"statusWaiting": "Đang chờ",
|
||||
"statusDone": "Xong",
|
||||
"statusFailed": "Thất bại",
|
||||
"statusCancelled": "Đã hủy",
|
||||
"dropUpload": "Tải lên {{path}}",
|
||||
"dropDownload": "Tải xuống vào {{path}}"
|
||||
},
|
||||
"editor": {
|
||||
"readFailed": "Đọc thất bại",
|
||||
"saveFailed": "Lưu thất bại",
|
||||
"unsavedClose": "Có thay đổi chưa lưu. Vẫn đóng?",
|
||||
"saving": "Đang lưu...",
|
||||
"save": "Lưu",
|
||||
"saved": "Đã lưu tệp",
|
||||
"loadingEditor": "Đang tải trình soạn thảo...",
|
||||
"footer": "UTF-8 · Monaco · ⌘/Ctrl+S lưu · tối đa ~2MB",
|
||||
"charCount": "{{count}} ký tự",
|
||||
"unsavedMark": " · chưa lưu",
|
||||
"savedMark": " · đã lưu"
|
||||
},
|
||||
"toast": {
|
||||
"renamed": "Đã đổi tên thành {{name}}",
|
||||
"renameFailed": "Đổi tên thất bại",
|
||||
"pathCopied": "Đường dẫn đã được sao chép vào clipboard",
|
||||
"pathCopyFailed": "Không thể sao chép đường dẫn",
|
||||
"chmodUpdated": "Đã cập nhật quyền thành {{mode}}",
|
||||
"chmodFailed": "Không thể cập nhật quyền",
|
||||
"uploadPartial": "{{action}} đã hoàn tất {{completed}}, thất bại {{failed}}: {{detail}}",
|
||||
"uploadSuccess": "{{action}} hoàn tất cho {{completed}} mục",
|
||||
"uploadAction": "Tải lên",
|
||||
"downloadAction": "Tải xuống",
|
||||
"noFolderUpload": "Tải lên thư mục thất bại",
|
||||
"noDragPath": "Đường dẫn kéo-thả không khả dụng; hãy dùng Tải lên",
|
||||
"noFolderRecursive": "Truyền thư mục đệ quy thất bại; thử lại hoặc dùng Tải lên"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"panel": {
|
||||
"title": "Đoạn mã lệnh"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Tìm đoạn mã lệnh..."
|
||||
},
|
||||
"form": {
|
||||
"name": "Tên",
|
||||
"command": "Lệnh",
|
||||
"tags": "Thẻ",
|
||||
"tagsHint": "(phân tách bằng dấu phẩy)",
|
||||
"namePlaceholder": "vd. Khởi động lại Nginx",
|
||||
"commandPlaceholder": "sudo systemctl restart nginx\n# hỗ trợ {{host}} {{username}} {{date}}",
|
||||
"variables": "Biến:"
|
||||
},
|
||||
"dialog": {
|
||||
"createTitle": "Đoạn mã mới",
|
||||
"editTitle": "Sửa đoạn mã"
|
||||
},
|
||||
"empty": {
|
||||
"noMatch": "Không có đoạn mã phù hợp",
|
||||
"noMatchDesc": "Thử từ khóa khác",
|
||||
"noSnippets": "Chưa có đoạn mã nào",
|
||||
"noSnippetsDesc": "Lưu các lệnh thường dùng và chèn chúng vào terminal"
|
||||
},
|
||||
"action": {
|
||||
"create": "Đoạn mã mới",
|
||||
"insert": "Chèn vào terminal",
|
||||
"noTerminal": "Không có terminal hoạt động"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"toolbar": {
|
||||
"splitHorizontal": "Chia trái/phải",
|
||||
"splitVertical": "Chia trên/dưới",
|
||||
"addPane": "Thêm pane",
|
||||
"closePane": "Đóng pane hiện tại",
|
||||
"maximizePane": "Phóng to pane hiện tại",
|
||||
"restoreLayout": "Khôi phục bố cục chia",
|
||||
"broadcast": "Phát sóng",
|
||||
"broadcastAria": "Phát sóng đầu vào",
|
||||
"broadcastOn": "Phát sóng đang bật: đồng bộ đầu vào tới {{count}} terminal trong phạm vi",
|
||||
"broadcastOffPro": "Phát sóng đầu vào (Pro) · {{count}} terminal trong phạm vi",
|
||||
"broadcastNeedPanesTab": "Tab này cần ít nhất 2 pane sẵn sàng để phát sóng (chia trước tiên)",
|
||||
"broadcastNeedPanesAll": "Tất cả tab terminal cần ít nhất 2 terminal sẵn sàng để phát sóng",
|
||||
"broadcastScopeAria": "Phạm vi phát sóng",
|
||||
"broadcastScopeTab": "Pane của tab hiện tại",
|
||||
"broadcastScopeAll": "Tất cả tab terminal",
|
||||
"broadcastActive": "Đang phát sóng · {{count}}",
|
||||
"aiAssistant": "Trợ lý AI",
|
||||
"aiOpen": "Mở trợ lý AI terminal",
|
||||
"aiClose": "Đóng trợ lý AI terminal",
|
||||
"aiTitle": "Trợ lý AI terminal (Pro)",
|
||||
"paneCount": "{{current}}/{{max}}",
|
||||
"labelLocal": "Terminal cục bộ",
|
||||
"labelSsh": "Terminal SSH",
|
||||
"closePaneLabel": "Đóng pane hiện tại",
|
||||
"closeTabLabel": "Đóng tab terminal hiện tại",
|
||||
"targetSshSession": "Phiên SSH hiện tại"
|
||||
},
|
||||
"overlay": {
|
||||
"shellClosedIdle": "Hết thời gian chờ nhàn rỗi; shell đã thoát",
|
||||
"shellClosed": "Shell đã thoát",
|
||||
"shellClosedHint": "Kết nối SSH vẫn còn; các pane khác, SFTP và đường hầm không bị ảnh hưởng",
|
||||
"reopenShell": "Mở lại shell",
|
||||
"reopening": "Đang mở…",
|
||||
"disconnected": "Đã ngắt kết nối",
|
||||
"disconnectedHint": "Phiên SSH đã kết thúc hoặc mạng bị ngắt. Nhấn bên dưới để kết nối lại.",
|
||||
"reconnect": "Kết nối lại",
|
||||
"suspended": "Kết nối đã bị tạm dừng",
|
||||
"suspendedHint": "Không hoạt động một thời gian; kết nối đã bị tạm dừng để tiết kiệm tài nguyên",
|
||||
"resume": "Tiếp tục kết nối",
|
||||
"connectFailed": "Kết nối thất bại",
|
||||
"connectFailedHint": "Kiểm tra máy chủ, cổng, tên người dùng và xác thực",
|
||||
"retryConnect": "Thử kết nối lại",
|
||||
"connecting": "Đang kết nối…",
|
||||
"reconnecting": "Đang tự kết nối lại{{attempt}}…",
|
||||
"reconnectingAttempt": " ({{count}})",
|
||||
"localShellExited": "Shell cục bộ đã thoát"
|
||||
},
|
||||
"hostKey": {
|
||||
"titleNew": "Xác minh khóa máy chủ",
|
||||
"titleChanged": "Khóa máy chủ đã thay đổi",
|
||||
"descNew": "Kết nối đầu tiên tới máy chủ này. Xác minh dấu vết trước khi tin tưởng.",
|
||||
"descChanged": "Khóa SSH của máy chủ này không còn khớp với bản ghi cục bộ. Có nguy cơ MITM.",
|
||||
"host": "Máy chủ",
|
||||
"type": "Loại",
|
||||
"fingerprint": "Dấu vết SHA256",
|
||||
"previousFingerprint": "Dấu vết trước đó",
|
||||
"reject": "Từ chối",
|
||||
"acceptOnce": "Tin tưởng một lần",
|
||||
"acceptAlways": "Luôn tin tưởng",
|
||||
"acceptAlwaysChanged": "Tin tưởng và cập nhật"
|
||||
},
|
||||
"contextMenu": {
|
||||
"aria": "Thao tác terminal",
|
||||
"copy": "Sao chép",
|
||||
"paste": "Dán",
|
||||
"selectAll": "Chọn tất cả",
|
||||
"clear": "Xóa màn hình",
|
||||
"splitRight": "Chia bên phải",
|
||||
"splitDown": "Chia xuống dưới",
|
||||
"maximizePane": "Phóng to pane hiện tại",
|
||||
"restoreLayout": "Khôi phục bố cục chia"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Tìm kiếm...",
|
||||
"previous": "Trước đó (Shift+Enter)",
|
||||
"next": "Kế tiếp (Enter)",
|
||||
"close": "Đóng (Escape)"
|
||||
},
|
||||
"zmodem": {
|
||||
"uploadTransferring": "tải lên rz: {{detail}}",
|
||||
"downloadTransferring": "tải xuống sz: {{detail}}",
|
||||
"selectLocalFile": "Chọn tệp cục bộ",
|
||||
"pickUploadTitle": "Chọn tệp để tải lên (rz)",
|
||||
"uploadedCount": "Đã tải lên {{count}} tệp",
|
||||
"downloadedSingle": "{{path}}",
|
||||
"downloadedCount": "Đã tải xuống {{count}} tệp → {{dir}}",
|
||||
"transferDone": "Truyền hoàn tất",
|
||||
"transferFailed": "Truyền thất bại {{message}}",
|
||||
"uploadSuccessTerminal": "✓ Đã tải lên {{count}} tệp tới thư mục làm việc từ xa",
|
||||
"downloadSuccessTerminal": "✓ Đã tải xuống {{path}}",
|
||||
"savedDownloadsSingle": "✓ Đã lưu vào Downloads",
|
||||
"savedDownloadsMultiple": "✓ Đã lưu {{count}} tệp vào Downloads",
|
||||
"nativeApiUnavailable": "API gốc không khả dụng",
|
||||
"readFailed": "Đọc thất bại: {{name}}",
|
||||
"writeFailed": "Ghi thất bại: {{name}}",
|
||||
"createLocalShellFailed": "Không thể tạo shell cục bộ",
|
||||
"createRemoteShellFailed": "Không thể tạo shell từ xa",
|
||||
"createShellFailed": "Không thể tạo shell: {{error}}"
|
||||
},
|
||||
"clipboard": {
|
||||
"readFailed": "Không thể đọc clipboard",
|
||||
"writeFailed": "Không thể ghi clipboard"
|
||||
},
|
||||
"input": {
|
||||
"failed": "Đầu vào terminal thất bại"
|
||||
},
|
||||
"connection": {
|
||||
"errorPrefix": "Lỗi: {{message}}",
|
||||
"autoReconnecting": "Đang tự kết nối lại ({{attempt}})...",
|
||||
"autoReconnectLimit": "Đã đạt giới hạn tự kết nối lại ({{max}}){{reasonSuffix}}",
|
||||
"autoReconnectLimitReason": " — {{reason}}",
|
||||
"disconnectedRetry": "Đã ngắt kết nối, thử lại {{attempt}}/{{max}} sau {{seconds}} giây...",
|
||||
"autoReconnectBanner": "[Tự kết nối lại] Đang thử lại {{attempt}}/{{max}} sau {{seconds}} giây",
|
||||
"disconnectedBanner": "[Đã ngắt kết nối] {{reason}}",
|
||||
"noConfig": "Không có thông tin kết nối"
|
||||
}
|
||||
}
|
||||
@@ -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}}"
|
||||
}
|
||||
}
|
||||
@@ -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": "副本"
|
||||
}
|
||||
}
|
||||
@@ -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}}(远端此电脑可见)"
|
||||
}
|
||||
}
|
||||
@@ -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": "发生未知错误"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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}}"
|
||||
}
|
||||
}
|
||||
@@ -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 自定义"
|
||||
}
|
||||
}
|
||||
@@ -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": "文件夹递归传输失败,请重试或改用上传按钮"
|
||||
}
|
||||
}
|
||||
@@ -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": "无活跃终端"
|
||||
}
|
||||
}
|
||||
@@ -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": "无可用连接信息"
|
||||
}
|
||||
}
|
||||
@@ -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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,335 @@
|
||||
{
|
||||
"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 僅一條動態轉發,連接埠固定 1080。",
|
||||
"dynamicPortHint": "If the port is busy, pick another local port (e.g. 1081).",
|
||||
"ruleList": "規則",
|
||||
"ruleListEmpty": "暫無本地 / 遠端規則",
|
||||
"addSection": "新增",
|
||||
"errorDynamicExists": "動態轉發已存在(1080),請直接啟停。",
|
||||
"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": "副本"
|
||||
}
|
||||
}
|
||||
@@ -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}}(遠端本機可見)"
|
||||
}
|
||||
}
|
||||
@@ -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": "發生未知錯誤"
|
||||
}
|
||||
}
|
||||
@@ -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": " · 本機回顯"
|
||||
}
|
||||
}
|
||||
@@ -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": "prod, 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}}"
|
||||
}
|
||||
}
|
||||
@@ -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 自訂"
|
||||
}
|
||||
}
|
||||
@@ -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": "資料夾遞迴傳輸失敗,請重試或改用上傳按鈕"
|
||||
}
|
||||
}
|
||||
@@ -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": "無活躍終端機"
|
||||
}
|
||||
}
|
||||
@@ -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 金鑰與本機記錄不一致,可能存在 MITM 中間人攻擊風險。",
|
||||
"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": "無可用連線資訊"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user