mirror of
https://github.com/YuzuZensai/Termix.git
synced 2026-09-14 02:59:06 +00:00
v2.2.0 (#738)
* Improve Docker container list UI * Rework SSH tunnel forwarding * Update macOS Electron packaging * Optimize frontend bundle splitting * Add beta version update status * Add client tunnel preset management * Secure cookie authentication flows * Add client tunnel bridge support * Preserve sessions on restart * Update runtime to Node 24 * Add client remote tunnel support * Fix stale frontend cache handling * Fix Docker image platforms for Node 24 * Fix Electron packaging workflows * Fix client auth cache after upgrades * chore: cleanup files * fix: npm i error * Fix OIDC auth cookie readiness * Fix Docker npm ci config * Add react-is peer dependency * Fix Electron auth and cache handling * Improve terminal clipboard and refresh actions * feat: add API keys * feat: improve lazy loading with loading spinners * feat: Introduce FolderTree component with lazy-loading and motion animations for improved file manager UX (#735) * feat: integrate FolderTree component with lazy-loading for file manager sidebar - Add motion animation library (v12.38.0) for smooth UI transitions - Create new FolderTree component with advanced keyboard navigation support - Refactor kbd component: introduce KbdKey and KbdSeparator subcomponents - Implement lazy-loading strategy for directory tree in FileManagerSidebar - Refactor FileManagerSidebar with improved code organization and better separation of concerns - Update keyboard shortcut displays across CommandPalette, FileViewer, and Dashboard - Change React/ReactDOM dependency flags from dev to devOptional in package-lock.json BREAKING CHANGE: KbdGroup component has been replaced. Use <Kbd><KbdKey>...</KbdKey><KbdSeparator /></Kbd> instead. - Improves UX with smooth animations and better folder navigation - Reduces initial load time through lazy-loading subdirectories - Enhances accessibility with ARIA labels and keyboard navigation - Maintains dark mode support and proper styling * fix: incorrect use of the theme system and linked file manger sidebar with current folder --------- Co-authored-by: suryacagur <suryacagur.dev@gmail.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * Enhance VNC token generation to include optional username parameter and refactor username input handling in HostGeneralTab (#733) * Fix Docker build info generation * Remove unused node-fetch dependency * feat: prompt user for SSH key passphrase on use (#715) When an encrypted SSH key has no stored passphrase, show a lightweight dialog prompting the user to enter it at connection time instead of failing with a parse error. Supports both desktop and mobile terminals. Closes Termix-SSH/Support#354 * fix: prevent session crash when uploading to permission-denied directory (#716) - Wrap writeFile sftp.stat callback in try-catch to prevent uncaught exceptions from escaping the callback into the event loop - Add missing stream.stderr error handler in writeFile fallback to prevent unhandled error events from crashing the process - Remove bogus activeOperations decrement in both writeFile and uploadFile fallback methods (counter was never incremented) - Add res.headersSent checks in fallback disconnect paths to prevent ERR_HTTP_HEADERS_SENT crashes Closes Termix-SSH/Support#652 * feat: add LOG_TIMESTAMP_FORMAT env var for 24h/ISO log timestamps (#718) Support LOG_TIMESTAMP_FORMAT environment variable with values: - "24h": 24-hour format (14:58:45) - "iso": ISO 8601 format (2026-04-25T14:58:45.000Z) - default: locale format (2:58:45 PM) Closes Termix-SSH/Support#650 * feat: open file manager at terminal current working directory (#719) * feat: open file manager at terminal current working directory When right-clicking in the terminal and selecting "Open File Manager Here", query the current working directory via a separate SSH exec channel and pass it as the initial path to the file manager tab. Closes Termix-SSH/Support#649 * chore: sync package-lock.json with node-fetch and deps Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: remove undefined TerminalContextMenu from bad merge resolution Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: show reconnect overlay when SSH server reboots (#720) When the remote server reboots, the SSH connection closes while the stream is still active. The close handler only sent the "disconnected" message when sshStream was null, so the frontend never received the disconnect notification and hung with a blinking cursor. Change the else-if condition to always send the "disconnected" message regardless of stream state. Closes Termix-SSH/Support#648 * feat: support read-only Docker container mode (#721) Move nginx runtime files (config, pid, logs, temp dirs) from /app/nginx/ to /tmp/nginx/ so the container can run with read_only: true. Template files remain in /app/nginx/ as read-only assets. Users can now harden the container with: read_only: true tmpfs: - /tmp Closes Termix-SSH/Support#647 * fix: allow editing host folder without re-entering password (#722) When editing an existing host, the password field is stripped by the backend for security. The form validation treated the empty password as invalid, disabling the Update Host button even for non-auth changes like folder assignment. Use an "existing_password" sentinel (mirroring the existing "existing_key" pattern) to represent an unchanged password during editing, skip validation for it, and omit it from the update payload. Closes Termix-SSH/Support#645 * fix: auto-close tab on graceful SSH disconnect (exit/Ctrl+D) (#723) Distinguish between graceful shell exit and unexpected disconnection using the stream close event's exit code. When the shell exits normally (code != null), send "session_ended" instead of "disconnected". The frontend auto-closes the tab on session_ended, and shows the reconnect overlay only on unexpected disconnections. Closes Termix-SSH/Support#643 * fix: reattach existing SSH session on WebSocket reconnect (#724) WebSocket reconnection was always creating a new SSH connection with full authentication instead of reattaching to the existing SSH session. The condition `!isReconnectingRef.current` prevented session reattach during reconnection, causing repeated password auth attempts that trigger SSHGuard/fail2ban blocking. Remove the guard so reconnection tries to reattach the persisted session first. If the session has expired, the backend sends sessionExpired and the frontend falls back to a new connection. Closes Termix-SSH/Support#644 * fix: prevent browser crash when uploading large files (>100MB) (#725) The file-to-base64 conversion used a byte-by-byte string concatenation loop (String.fromCharCode + btoa), which allocated ~3x the file size in intermediate strings, causing the browser tab to OOM on files over ~100MB. Replace with FileReader.readAsDataURL which delegates base64 encoding to the browser engine natively, avoiding the intermediate allocations. Closes Termix-SSH/Support#577 * fix: support SSH multi-factor auth with publickey + password (#726) When sshd requires AuthenticationMethods publickey,password, the connection failed because the key auth branch only set privateKey without also setting password. After publickey partial auth succeeded, ssh2 sent keyboard-interactive (due to tryKeyboard:true) instead of password, which the server rejected. Pass the credential password alongside the private key so ssh2 can complete the password step after publickey succeeds. Closes Termix-SSH/Support#629 * feat(oidc): add OIDC_ALLOW_REGISTRATION env to bypass allow_registration for OIDC (#727) The `allow_registration` setting blocks both password-based and OIDC user creation. Admins who want to close password registration but still onboard new users via a trusted IdP (with the existing `OIDC_ALLOWED_USERS` whitelist) have no way to do that today. Introduce an `OIDC_ALLOW_REGISTRATION` env var. When set to `true`, the OIDC callback skips the `allow_registration` settings check while still honoring the `OIDC_ALLOWED_USERS` whitelist. Password registration via `POST /users/create` continues to respect `allow_registration`. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * perf: lazy load locales, file previews, and decouple startup imports (#729) * perf: lazy load locale bundles * perf: lazy load file preview modules * perf: avoid eager api client load on startup * chore: remove dead code, tighten types, fix lint warnings (#730) * chore: clean up low-risk lint warnings * chore: tighten utility types * chore: preserve backend error causes * chore: simplify command palette host state * chore: remove unused frontend code * chore: prune stale frontend state * chore: trim unused navigation code * chore: prune unused user settings props * chore: trim unused sidebar state * chore: remove stale host editor imports * chore: tighten shared frontend types * chore: narrow desktop helper types * chore: type network topology data * chore: type connection log errors * chore: use typed tab context * chore: type api client error metadata * chore: tighten terminal config types * chore: type host proxy chains * chore: type host editor form data * chore: use typed host viewer fields * chore: format app builder patch script * Fix client auth cache after upgrades * chore: fix pr checks after dev merge * fix: remove duplicate session-expired useEffect in FullScreenAppWrapper Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Xenthys <x@dis.gg> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: npm package warnings * feat: reconnect after file manager disconnects * feat: add docs button in api keys * feat: change colors for server tunnels * fix: fetch password from API for Copy Password button (#736) * chore: update readme's * feat: improve c2s UI in user profile * feat: improve ssh key detection and move open file manager at path for terminal button * fix: restore missing getHostPassword import in Tab.tsx (#737) * fix: security related fixes * feat: improve alert code * Fix Electron clipboard handling * fix: untranslated alert text --------- Co-authored-by: Xenthys <x@dis.gg> Co-authored-by: PT Kelana Tech Solutions <ptkelanatechsolutions@gmail.com> Co-authored-by: suryacagur <suryacagur.dev@gmail.com> Co-authored-by: zimmra <28514085+zimmra@users.noreply.github.com> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Fuad <funtik1229@yandex.ru>
This commit is contained in:
co-authored by
Xenthys
PT Kelana Tech Solutions
suryacagur
zimmra
ZacharyZcR
Claude Sonnet 4.6
Fuad
parent
af9fc95b0e
commit
2768f11dfc
+147
-29
@@ -402,6 +402,8 @@
|
||||
"currentVersion": "You are running version {{version}}",
|
||||
"updateAvailable": "Update Available",
|
||||
"newVersionAvailable": "A new version is available! You are running {{current}}, but {{latest}} is available.",
|
||||
"betaVersion": "Beta Version",
|
||||
"betaVersionDesc": "You are running {{current}}, which is newer than the latest stable release {{latest}}.",
|
||||
"releasedOn": "Released on {{date}}",
|
||||
"downloadUpdate": "Download Update",
|
||||
"dismiss": "Dismiss",
|
||||
@@ -426,6 +428,8 @@
|
||||
"warning": "Warning",
|
||||
"info": "Info",
|
||||
"success": "Success",
|
||||
"unsavedChanges": "Unsaved changes",
|
||||
"dismiss": "Dismiss",
|
||||
"loading": "Loading...",
|
||||
"required": "Required",
|
||||
"optional": "Optional",
|
||||
@@ -471,6 +475,7 @@
|
||||
"chinese": "Chinese",
|
||||
"german": "German",
|
||||
"cancel": "Cancel",
|
||||
"done": "Done",
|
||||
"username": "Username",
|
||||
"name": "Name",
|
||||
"login": "Login",
|
||||
@@ -486,6 +491,7 @@
|
||||
"save": "Save",
|
||||
"saving": "Saving...",
|
||||
"delete": "Delete",
|
||||
"rename": "Rename",
|
||||
"edit": "Edit",
|
||||
"add": "Add",
|
||||
"search": "Search",
|
||||
@@ -559,7 +565,8 @@
|
||||
"passwordCopied": "Password copied to clipboard",
|
||||
"sudoPasswordCopied": "Sudo password copied to clipboard",
|
||||
"noPasswordAvailable": "No password available",
|
||||
"failedToCopyPassword": "Failed to copy password"
|
||||
"failedToCopyPassword": "Failed to copy password",
|
||||
"openFileManager": "Open File Manager"
|
||||
},
|
||||
"admin": {
|
||||
"title": "Admin Settings",
|
||||
@@ -876,7 +883,42 @@
|
||||
"passwordMinLength": "Password must be at least 6 characters",
|
||||
"currentRoles": "Current Roles",
|
||||
"noRolesAssigned": "No roles assigned",
|
||||
"assignNewRole": "Assign New Role"
|
||||
"assignNewRole": "Assign New Role",
|
||||
"apiKeys": {
|
||||
"tabLabel": "API Keys",
|
||||
"title": "API Keys",
|
||||
"createApiKey": "Create API Key",
|
||||
"createApiKeyDescription": "Create a new API key scoped to a specific user. The token is shown only once.",
|
||||
"keyCreated": "API Key Created",
|
||||
"keyCreatedDescription": "Copy this key now — it will not be shown again.",
|
||||
"keyName": "Key Name",
|
||||
"keyNamePlaceholder": "e.g. CI/CD Pipeline",
|
||||
"scopedUser": "Scoped User",
|
||||
"selectUser": "Select a user...",
|
||||
"searchUsers": "Search users...",
|
||||
"noUsersFound": "No users found.",
|
||||
"expiresAt": "Expires At",
|
||||
"optional": "optional",
|
||||
"expiresAtHelp": "Leave empty for a key that never expires.",
|
||||
"copyWarningTitle": "Save your API key",
|
||||
"copyWarningDescription": "This key will only be shown once. Store it in a safe place.",
|
||||
"apiKey": "API Key",
|
||||
"tokenCopied": "Token copied to clipboard",
|
||||
"creating": "Creating...",
|
||||
"nameRequired": "Key name is required",
|
||||
"userRequired": "Please select a user",
|
||||
"failedToCreate": "Failed to create API key",
|
||||
"noKeys": "No API keys found.",
|
||||
"name": "Name",
|
||||
"prefix": "Prefix",
|
||||
"lastUsed": "Last Used",
|
||||
"never": "Never",
|
||||
"revokeKey": "Revoke key",
|
||||
"confirmRevoke": "Are you sure you want to revoke the API key \"{{name}}\"? This cannot be undone.",
|
||||
"revokedSuccessfully": "API key revoked successfully",
|
||||
"failedToRevoke": "Failed to revoke API key",
|
||||
"failedToFetch": "Failed to fetch API keys"
|
||||
}
|
||||
},
|
||||
"hosts": {
|
||||
"title": "Host Manager",
|
||||
@@ -970,28 +1012,8 @@
|
||||
"enableDocker": "Enable Docker",
|
||||
"defaultPath": "Default Path",
|
||||
"defaultPathDesc": "Default directory when opening file manager for this host",
|
||||
"tunnelConnections": "Tunnel Connections",
|
||||
"connection": "Connection",
|
||||
"remove": "Remove",
|
||||
"sourcePort": "Source Port",
|
||||
"sourcePortDesc": " (Source refers to the Current Connection Details in the General tab)",
|
||||
"endpointPort": "Endpoint Port",
|
||||
"endpointSshConfig": "Endpoint SSH Configuration",
|
||||
"tunnelForwardDescription": "This tunnel will forward traffic from port {{sourcePort}} on the source machine (current connection details in general tab) to port {{endpointPort}} on the endpoint machine.",
|
||||
"maxRetries": "Max Retries",
|
||||
"maxRetriesDescription": "Maximum number of retry attempts for tunnel connection.",
|
||||
"retryInterval": "Retry Interval (seconds)",
|
||||
"retryIntervalDescription": "Time to wait between retry attempts.",
|
||||
"autoStartContainer": "Auto Start on Container Launch",
|
||||
"autoStartDesc": "Automatically start this tunnel when the container launches",
|
||||
"addConnection": "Add Tunnel Connection",
|
||||
"tunnelType": "Tunnel Type",
|
||||
"tunnelTypeLocal": "Local (-L)",
|
||||
"tunnelTypeRemote": "Remote (-R)",
|
||||
"tunnelTypeLocalDesc": "Forward local port to remote endpoint",
|
||||
"tunnelTypeRemoteDesc": "Forward remote port to local machine",
|
||||
"tunnelForwardDescriptionLocal": "This tunnel will forward traffic from local port {{sourcePort}} to port {{endpointPort}} on the endpoint machine.",
|
||||
"tunnelForwardDescriptionRemote": "This tunnel will forward traffic from port {{sourcePort}} on the source machine (current connection details in general tab) to port {{endpointPort}} on the endpoint machine.",
|
||||
"sshpassRequired": "Sshpass Required For Password Authentication",
|
||||
"sshpassRequiredDesc": "For password authentication in tunnels, sshpass must be installed on the system.",
|
||||
"otherInstallMethods": "Other installation methods:",
|
||||
@@ -1656,6 +1678,7 @@
|
||||
"automaticFallback": "Automatically trying {{method}} authentication...",
|
||||
"totpTimeout": "TOTP verification timeout. Please reconnect.",
|
||||
"passwordTimeout": "Password verification timeout. Please reconnect.",
|
||||
"sessionEnded": "Session ended.",
|
||||
"connectionRejected": "Connection rejected by server. Please check your authentication and network configuration.",
|
||||
"hostKeyRejected": "SSH host key verification rejected. Connection cancelled.",
|
||||
"sessionTakenOver": "Session was opened in another tab. Reconnecting...",
|
||||
@@ -1993,12 +2016,10 @@
|
||||
"ascending": "Ascending",
|
||||
"descending": "Descending"
|
||||
},
|
||||
"tunnel": {
|
||||
"noTunnelsConfigured": "No Tunnels Configured",
|
||||
"configureTunnelsInHostSettings": "Configure tunnel connections in the Host Manager to get started"
|
||||
},
|
||||
"tunnels": {
|
||||
"title": "SSH Tunnels",
|
||||
"noTunnelsConfigured": "No Tunnels Configured",
|
||||
"configureTunnelsInHostSettings": "Configure tunnel connections in the Host Manager to get started",
|
||||
"noSshTunnels": "No SSH Tunnels",
|
||||
"createFirstTunnelMessage": "You haven't created any SSH tunnels yet. Configure tunnel connections in the Host Manager to get started.",
|
||||
"connected": "Connected",
|
||||
@@ -2019,27 +2040,100 @@
|
||||
"disconnect": "Disconnect",
|
||||
"cancel": "Cancel",
|
||||
"port": "Port",
|
||||
"localPort": "Local Port",
|
||||
"remotePort": "Remote Port",
|
||||
"currentHostPort": "Current Host Port",
|
||||
"endpointPort": "Endpoint Port",
|
||||
"bindIp": "Local IP",
|
||||
"currentHostIp": "Current Host IP",
|
||||
"endpointSshConfig": "Endpoint SSH Configuration",
|
||||
"endpointSshConfigRequired": "Endpoint SSH configuration is required",
|
||||
"endpointSshHost": "Endpoint SSH Host",
|
||||
"endpointSshHostPlaceholder": "Select a configured host",
|
||||
"endpointSshHostRequired": "Select an endpoint SSH host for each client tunnel.",
|
||||
"attempt": "Attempt {{current}} of {{max}}",
|
||||
"nextRetryIn": "Next retry in {{seconds}} seconds",
|
||||
"checkDockerLogs": "Check your Docker logs for the error reason, join the",
|
||||
"orCreate": "or create a ",
|
||||
"noTunnelConnections": "No tunnel connections configured",
|
||||
"tunnelConnections": "Tunnel Connections",
|
||||
"serverTunnels": "Server Tunnels",
|
||||
"serverTunnelsDesc": "Backend-managed tunnels stored with this host.",
|
||||
"clientTunnels": "Client Tunnels",
|
||||
"clientTunnelsUnavailable": "Client tunnels require a desktop client.",
|
||||
"serverTunnel": "Server Tunnel",
|
||||
"clientTunnel": "Client Tunnel",
|
||||
"addServerTunnel": "Add Server Tunnel",
|
||||
"addClientTunnel": "Add Client Tunnel",
|
||||
"noServerTunnels": "No server tunnels configured.",
|
||||
"noClientTunnels": "No client tunnels configured on this desktop.",
|
||||
"manageClientTunnels": "Manage Client Tunnels",
|
||||
"addTunnel": "Add Tunnel",
|
||||
"editTunnel": "Edit Tunnel",
|
||||
"deleteTunnel": "Delete Tunnel",
|
||||
"tunnelName": "Tunnel Name",
|
||||
"localPort": "Local Port",
|
||||
"remoteHost": "Remote Host",
|
||||
"remotePort": "Remote Port",
|
||||
"autoStart": "Auto Start",
|
||||
"autoStartContainer": "Auto Start on Launch",
|
||||
"autoStartContainerDesc": "Automatically start this tunnel when your Termix server launches.",
|
||||
"autoStartEnableFailed": "Host saved, but failed to start auto-start tunnels for {{name}}.",
|
||||
"clientAutoStartDesc": "Starts when this desktop client opens and stays connected.",
|
||||
"clientManualStartDesc": "Use Start and Stop from this row. Termix will not open it automatically.",
|
||||
"clientRemoteServerNote": "Remote forwarding may require AllowTcpForwarding and GatewayPorts on the endpoint SSH server. The remote port closes when this desktop disconnects.",
|
||||
"clientTunnelStarted": "Client tunnel started",
|
||||
"clientTunnelStopped": "Client tunnel stopped",
|
||||
"tunnelTestSucceeded": "Tunnel test succeeded",
|
||||
"tunnelTestFailed": "Tunnel test failed",
|
||||
"localSaved": "Client tunnels saved",
|
||||
"localSaveError": "Failed to save local client tunnels",
|
||||
"invalidBindIp": "Local IP must be a valid IPv4 address.",
|
||||
"invalidLocalTargetIp": "Local target IP must be a valid IPv4 address.",
|
||||
"invalidCurrentHostIp": "Current Host IP must be a valid IPv4 address.",
|
||||
"invalidLocalPort": "Local port must be between 1 and 65535.",
|
||||
"invalidRemotePort": "Remote port must be between 1 and 65535.",
|
||||
"invalidLocalTargetPort": "Local target port must be between 1 and 65535.",
|
||||
"invalidEndpointPort": "Endpoint port must be between 1 and 65535.",
|
||||
"duplicateAutoStartBind": "Only one auto-start client tunnel can use {{bind}}.",
|
||||
"manualControlError": "Failed to update tunnel state.",
|
||||
"saveHostBeforeManualControl": "Save this host before starting or stopping its server tunnels.",
|
||||
"status": "Status",
|
||||
"active": "Active",
|
||||
"inactive": "Inactive",
|
||||
"start": "Start",
|
||||
"stop": "Stop",
|
||||
"test": "Test",
|
||||
"restart": "Restart",
|
||||
"connectionType": "Connection Type",
|
||||
"type": "Tunnel Type",
|
||||
"typeLocal": "Local (-L)",
|
||||
"typeRemote": "Remote (-R)",
|
||||
"typeDynamic": "Dynamic (-D)",
|
||||
"typeServerLocalDesc": "Current host to endpoint.",
|
||||
"typeServerRemoteDesc": "Endpoint back to current host.",
|
||||
"typeClientLocalDesc": "Local computer to endpoint.",
|
||||
"typeClientRemoteDesc": "Endpoint back to local computer.",
|
||||
"typeClientDynamicDesc": "SOCKS on local computer.",
|
||||
"typeDynamicDesc": "Forward SOCKS5 CONNECT traffic through SSH",
|
||||
"forwardDescriptionServerLocal": "Current host {{sourcePort}} → endpoint {{endpointPort}}.",
|
||||
"forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → current host {{sourcePort}}.",
|
||||
"forwardDescriptionServerDynamic": "SOCKS on current host {{sourcePort}}.",
|
||||
"forwardDescriptionClientLocal": "Local {{sourcePort}} → remote {{endpointPort}}.",
|
||||
"forwardDescriptionClientRemote": "Remote {{sourcePort}} → local {{endpointPort}}.",
|
||||
"forwardDescriptionClientDynamic": "SOCKS on local port {{sourcePort}}.",
|
||||
"summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}",
|
||||
"summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}",
|
||||
"summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}",
|
||||
"autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}",
|
||||
"autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}",
|
||||
"autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}",
|
||||
"route": "Route:",
|
||||
"lastStarted": "Last started",
|
||||
"lastTested": "Last tested",
|
||||
"lastError": "Last error",
|
||||
"maxRetries": "Max Retries",
|
||||
"maxRetriesDescription": "Maximum amount of retry attempts.",
|
||||
"retryInterval": "Retry Interval (seconds)",
|
||||
"retryIntervalDescription": "Time to wait between retry attempts.",
|
||||
"local": "Local",
|
||||
"remote": "Remote",
|
||||
"dynamic": "Dynamic",
|
||||
@@ -2223,6 +2317,8 @@
|
||||
"sshProvideCredentialsDescription": "Please provide your SSH credentials to connect to this server.",
|
||||
"sshPasswordDescription": "Enter the password for this SSH connection.",
|
||||
"sshKeyPasswordDescription": "If your SSH key is encrypted, enter the passphrase here.",
|
||||
"passphraseRequired": "Passphrase Required",
|
||||
"passphraseRequiredDescription": "The SSH key is encrypted. Please enter the passphrase to unlock it.",
|
||||
"step1ScanQR": "Step 1: Scan the QR code with your authenticator app",
|
||||
"manualEntryCode": "Manual Entry Code",
|
||||
"cannotScanQRText": "If you can't scan the QR code, enter this code manually in your authenticator app",
|
||||
@@ -2297,7 +2393,7 @@
|
||||
"failedCompleteReset": "Failed to complete password reset",
|
||||
"invalidTotpCode": "Invalid TOTP code",
|
||||
"failedOidcLogin": "Failed to start OIDC login",
|
||||
"failedUserInfo": "Failed to get user info after OIDC login",
|
||||
"failedUserInfo": "Failed to get user info after login",
|
||||
"oidcAuthFailed": "OIDC authentication failed",
|
||||
"noTokenReceived": "No token received from login",
|
||||
"invalidAuthUrl": "Invalid authorization URL received from backend",
|
||||
@@ -2373,6 +2469,23 @@
|
||||
"showHostTagsDesc": "Display tags under each host in the sidebar. Disable to hide all tags.",
|
||||
"account": "Account",
|
||||
"appearance": "Appearance",
|
||||
"c2sTunnelConfigDesc": "Local desktop tunnels targeting configured SSH hosts.",
|
||||
"c2sTunnelPresets": "Client Tunnel Presets",
|
||||
"c2sTunnelPresetsDesc": "Save this desktop client's local tunnel list as a named server preset, or load a preset back into this client.",
|
||||
"c2sTunnelPresetsUnavailable": "Client tunnel presets are only available in the desktop client.",
|
||||
"c2sPresetName": "Preset Name",
|
||||
"c2sPresetNamePlaceholder": "Client preset name",
|
||||
"c2sPresetToLoad": "Preset To Load",
|
||||
"c2sNoPresetSelected": "No preset selected",
|
||||
"c2sNoPresets": "No presets saved",
|
||||
"c2sLoadPreset": "Load",
|
||||
"c2sCurrentLocalConfig": "{{count}} local client tunnel(s) configured on this desktop.",
|
||||
"c2sPresetSyncNote": "Presets are explicit snapshots; loading one replaces this desktop client's local client tunnel list.",
|
||||
"c2sPresetSaved": "Client tunnel preset saved",
|
||||
"c2sPresetLoaded": "Client tunnel preset loaded locally",
|
||||
"c2sPresetRenamed": "Client tunnel preset renamed",
|
||||
"c2sPresetDeleted": "Client tunnel preset deleted",
|
||||
"c2sPresetLoadError": "Failed to load client tunnel presets",
|
||||
"languageLocalization": "Language & Localization",
|
||||
"fileManagerSettings": "File Manager",
|
||||
"terminalSettings": "Terminal",
|
||||
@@ -2421,6 +2534,10 @@
|
||||
"description": "SSH credential description",
|
||||
"searchCredentials": "Search credentials by name, username, or tags...",
|
||||
"sshConfig": "endpoint ssh configuration",
|
||||
"bindLocalhost": "127.0.0.1 (bind to localhost)",
|
||||
"localListenerHost": "127.0.0.1 (listen locally)",
|
||||
"localTargetHost": "127.0.0.1 (target on this computer)",
|
||||
"socksListenerHost": "127.0.0.1 (SOCKS listener)",
|
||||
"homePath": "/home",
|
||||
"clientId": "your-client-id",
|
||||
"clientSecret": "your-client-secret",
|
||||
@@ -2600,6 +2717,7 @@
|
||||
"version": "Version",
|
||||
"upToDate": "Up to Date",
|
||||
"updateAvailable": "Update Available",
|
||||
"beta": "Beta",
|
||||
"uptime": "Uptime",
|
||||
"database": "Database",
|
||||
"healthy": "Healthy",
|
||||
|
||||
Reference in New Issue
Block a user