mirror of
https://github.com/YuzuZensai/Termix.git
synced 2026-09-13 10:49:03 +00:00
+5








0ff03110c9
* feat: add robust OSC 52 clipboard support for tmux/SSH clipboard sync (#587) Upgrade @xterm/addon-clipboard to v0.2.0 and add a custom RobustClipboardProvider that handles browser Clipboard API focus restrictions by deferring writes until the window regains focus. Uses Electron native clipboard when available for reliable access without browser API limitations. Changes: - Create src/lib/clipboard-provider.ts with write-only provider - Update all terminal components (desktop, mobile, docker console) - Add electronClipboard bridge in Electron preload - Add clipboard permission handler in Electron main process * chore: remove translations * feat: add 5-panel and 6-panel split screen layouts (#584) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open… * feat: show terminal title in tab name (#579) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal dir… * fix: allow OIDC JIT user creation when registration is disabled (#578) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL r… * feat: add file manager sorting by name, date, and size (#582) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to … * fix: unable to delete OIDC user due to missing table cleanup (#576) deleteUserAndRelatedData was missing cleanup for networkTopology, dashboardPreferences, and opksshTokens tables. When deleting an OIDC user who had records in these tables, the final DELETE on users hit SQLITE_CONSTRAINT_FOREIGNKEY. Add explicit deletes for all three tables before the user row deletion. * fix: use lightweight wget for Docker healthcheck (#558) - Replace node -e healthcheck with wget (avoid spawning full Node.js process) - Increase start-period from 30s to 60s for slower machines * feat: add "Remember Me" option to login (#585) When checked, browser sessions get 30-day expiry (same as desktop) instead of the default 7-day. The flag is passed through the full login chain including TOTP verification flow. * feat: expand environment variables in file manager path bar (#583) Resolve $VAR and ~ paths via SSH echo before navigating. Add /ssh/resolvePath backend endpoint, resolveSSHPath API function, and intercept in loadDirectory. Fix confirmEditingPath not to prefix ~ or $ paths with /. * fix: add Ctrl+Shift+C keyboard shortcut for terminal copy (#581) Ctrl+Shift+C was not handled in the custom key event handler, so users had no keyboard shortcut to copy selected text from the terminal. Adds the shortcut alongside existing Cmd+C (macOS) support, copying the current selection to clipboard. * feat: add OIDC user allowlist for registration control (#580) Add allowed_users field to OIDC config supporting comma-separated patterns: exact emails (user@example.com), domain suffixes (@example.com), or empty for unrestricted access. Only new user registrations are checked; existing users and first-user setup are unaffected. * fix: OIDC redirect_uri incorrectly resolves to localhost (#577) The OIDC authorize endpoint used the client Origin header to build the redirect_uri. Desktop/mobile apps connecting to a remote server send their local origin (e.g. http://localhost:5173), which got force-rewritten to http://localhost:30001. This broke OIDC for all non-browser clients. Use req.protocol + req.get("Host") instead, which correctly resolves to the server's own address. trust proxy is already enabled so this works behind reverse proxies too. * fix: keep terminal tab open on connection failure (#574) When SSH connection fails before being established, the terminal tab auto-closes immediately, leaving no error message visible to the user. Added wasConnectedRef to track whether the connection was ever established. Now only auto-closes tab on disconnect if it was previously connected. If never connected, shows error message instead. * fix: prevent restart loop when PUID/PGID is set to 0 (#571) When PUID=0, usermod sets the node user's UID to 0 (root), then gosu re-executes the script as node — but since node is now UID 0, the id check passes again, causing an infinite loop. Skip the gosu step when PUID=0 since the process is already root. * feat: add README translations for 12 additional languages (#569) Add translated README files for: Japanese, Korean, French, German, Spanish, Portuguese (BR), Russian, Arabic, Hindi, Turkish, Vietnamese, and Italian. Update language navigation bar in all README files including existing English and Chinese versions. * fix: allow OIDC users to export database without password (#575) OIDC users have no password, but the export endpoint unconditionally required password authentication. This reuses the same OIDC branch pattern already implemented in the import endpoint: skip password validation for OIDC users and authenticate via authenticateOIDCUser instead. Frontend now also skips the password input for OIDC users. * fix: SSH session leak — SFTP channel reuse + shared connection pool (#556) - Cache SFTP channel per session in file-manager, reuse across all operations - Remove all sftp.end() calls, channel lifecycle follows session - Auto-rebuild SFTP channel on error/close events - Extract SSHConnectionPool from server-stats into shared module - Factory-based pool API: getConnection(key, factory) / withConnection() - Migrate server-stats and tunnel killRemoteTunnelByMarker to shared pool - Refactor tunnel kill from callback hell to async/await Fixes: Termix-SSH/Support#485 * fix: handle DEC private mode sequences in syntax highlighter (#562) Extend CSI parameter byte matching to include ?, >, =, ! per ECMA-48. Previously sequences like \x1b[?1h and \x1b[?25l were not recognized as ANSI segments and fell through to plain text processing. * fix: catch disconnected client error in listFiles fallback (#564) When SFTP times out and the fallback calls client.exec() on an already-disconnected SSH client, the synchronous throw was not caught, crashing the backend process. * fix: forward Shift+Tab as backtab escape sequence (#563) Explicitly handle Shift+Tab in the custom key event handler by sending \x1b[Z (CSI Z) directly, with preventDefault to stop browser/WebView focus navigation from consuming the keystroke. * fix: disable font ligatures in terminal by default (#561) Nerd Fonts ligatures cause != to render as ≠, <= as ≤, etc. This is confusing for terminal use and breaks cursor positioning. * fix: bypass ls alias in file manager fallback (#560) - Add --color=never to command ls in SFTP fallback path - Use /bin/ls absolute path in sudo fallback to avoid alias/wrapper * feat: add overwrite option for JSON host import (#559) - Add overwrite mode to bulk-import endpoint, matching by ip:port:username - Import button now shows dropdown with "skip existing" and "overwrite existing" options - Response includes created/updated/skipped/failed counts * fix: status check tcpPing causing kex_exchange_identification flood in sshd logs (#557) - Complete SSH identification exchange before closing socket in tcpPing - Read server banner, send client identification string, then close gracefully - Prevents sshd from logging kex_exchange_identification errors on every ping - Increase default statusCheckInterval from 30s to 60s * fix: add WebSocket protocol-level ping to prevent proxy timeouts (#572) The existing application-level ping (JSON message via setInterval) stops working when the browser tab is backgrounded due to timer throttling. Reverse proxies like Cloudflare (100s) and Nginx Proxy Manager (60s) then drop the idle WebSocket connection. Add server-side ws.ping() every 30s for both terminal and docker console WebSocket servers. Protocol-level pings are handled by the browser's WebSocket implementation, unaffected by tab throttling. * feat: embed backend server in Electron desktop app (#539) * feat: embed backend server in Electron desktop app - Fork backend process on app startup (production mode only) - Store data in userData/server-data for desktop users - Unpack dist/ and native modules (better-sqlite3, ssh2) from asar - Resolve asar vs asar.unpacked paths for forked process - Serve frontend static files from Express for iframe auth flow - Add SPA fallback for non-API routes - Graceful shutdown with SIGTERM + 5s force kill - Add get-embedded-server-status IPC handler * fix: improve electron embedded server reliability - Extract duplicate fetch polyfill to shared httpFetch function - Wait for backend ready before creating window (15s timeout) - Use IPC message for graceful shutdown (SIGTERM doesn't work on Windows) - Simplify SPA fallback to use Accept header instead of route blacklist - Add IPC shutdown handler in backend starter * feat: system tray minimize and runtime server switching * fix: resolve all 274 ESLint errors in backend source files (#591) - Remove unused imports and variables (110 no-unused-vars) - Replace explicit any with proper types (80 no-explicit-any) - Add comments to intentionally empty catch blocks (66 no-empty) - Fix no-extra-boolean-cast, prefer-const, no-async-promise-executor - No logic changes, lint-only cleanup * fix: add missing clipboard shortcuts for terminal and docker console (#589) Terminal and Docker Console were missing Ctrl+Shift+C (copy selection), Ctrl+Insert (copy), and Shift+Insert (paste) shortcuts. Docker Console also lacked Ctrl+V paste entirely. Added consistent clipboard key handlers to both components. * fix: resolve all ESLint errors and increase CI heap size (#588) * fix: resolve all ESLint errors blocking CI - Downgrade mass legacy violations to warnings (no-unused-vars, no-explicit-any, no-empty, no-unused-expressions) - Turn off no-control-regex (terminal app uses control chars) - Ignore dist/release/Mobile dirs from linting - Auto-fix prefer-const, no-extra-boolean-cast - Fix real bugs: async promise executor, rules-of-hooks, dupe-else-if, constant-binary-expression, case-declarations - Run prettier --write on all files * fix: increase Node.js heap size for CI build step vite build OOMs on 2vCPU runner with default heap limit. Set NODE_OPTIONS=--max-old-space-size=4096 to prevent it. --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: reduce excessive disk writes from unconditional database persistence (#590) The in-memory database was serialized, encrypted, and written to disk every 15 seconds regardless of whether any data had changed. Combined with the 2-second debounced save trigger on every modification, this caused ~1GB/hour of disk writes even when idle. Add a dirty flag so the periodic save only writes when data has actually changed, and increase the safety-net interval from 15 seconds to 5 minutes. Triggered saves (on actual data modifications) continue to fire after the existing 2-second debounce. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: opkssh 404 and browser issues * fix: resolve backend TypeScript strict compilation errors (#592) Fix 56 type errors under tsconfig.node.json caused by overly broad unknown/Record<string, unknown> types from the ESLint cleanup. - Add JumpHostConfig interface for jump host chain resolution - Use proper types for resolvedCredentials, ConnectConfig, ProxyNode - Fix setWindow call to pass all 4 required arguments - Remove duplicate responseTimeout declarations in same scope - Add missing ClientChannel import * fix: clear Electron partition cookies on auth failure and logout (#599) When the Docker container is recreated, a new JWT secret is generated and all existing tokens become invalid. The 401 interceptor clears localStorage and document.cookie, but the Electron persistent partition cookies (partition: "persist:termix") are managed by Chromium and not accessible via document.cookie. This leaves the stale token in place, causing an infinite 401 retry loop and UI flickering. Add a clear-session-cookies IPC handler in the main process that uses session.cookies API to remove all partition cookies. Invoke it from the 401 interceptor and logoutUser function in the renderer. * refactor: unify Drizzle schema property names to camelCase (#598) * feat: add bulk host settings editing with multi-select UI Add PATCH /ssh/bulk-update endpoint for partial updates on multiple hosts. Frontend adds selection mode with checkboxes, folder-level select-all, and a floating action bar for monitoring, features, folder, and pin operations. * fix: correct Drizzle schema field name access for SSH credentials The sshCredentials schema uses mixed naming: private_key and key_password (snake_case) but authType and keyType (camelCase). Multiple files accessed these fields with wrong names, causing undefined values at runtime. Fixed direct bugs: - docker.ts: host.keyPassword -> host.key_password - docker-console.ts: jumpHost.keyPassword -> jumpHost.key_password - auth-manager.ts: cred.privateKey -> cred.private_key - auth-manager.ts: cred.passphrase -> cred.key_password Cleaned up redundant fallback patterns (e.g. credential.auth_type || credential.authType) across 8 files to use the correct property name directly. * refactor: unify Drizzle schema property names to camelCase Rename 18 snake_case Drizzle schema properties to camelCase across users, sshData, and sshCredentials tables. SQL column names unchanged, no database migration needed. This fixes the root cause of field name mismatch bugs where code accessed Drizzle results using camelCase but schema used snake_case. Updated all references across 21 files: routes, SSH modules, crypto utilities, type definitions, and field encryption mappings. * feat: add bulk host settings editing with multi-select UI (#596) Add PATCH /ssh/bulk-update endpoint for partial updates on multiple hosts. Frontend adds selection mode with checkboxes, folder-level select-all, and a floating action bar for monitoring, features, folder, and pin operations. * feat: add global default for status check and metrics intervals (#595) Add global monitoring interval settings that apply to all hosts by default, with per-host override capability. Hosts use the global default unless explicitly configured with a custom interval. * fix: shared credentials fail for OIDC users due to missing re-encryption (#593) When an admin shares a host with an OIDC user who hasn't logged in yet, a pending shared credential is created with needsReEncryption=true. The OIDC callback login path was missing the call to reEncryptPendingCredentialsForUser(), so the credential stayed pending forever. Additionally, server-stats.ts accessed the shared credential without a null check, causing a crash. - Add reEncryptPendingCredentialsForUser() call to OIDC callback login - Add null guard for getSharedCredentialForUser() in server-stats.ts * feat: SSH session persistence across browser refresh (#594) * feat: decouple SSH session lifecycle from WebSocket connections SSH sessions now persist independently of browser tab state. When a WebSocket disconnects (tab close/refresh), the SSH connection is detached rather than destroyed, allowing reattachment within a configurable idle timeout (default 30 min). - Add TerminalSessionManager singleton with output buffering, idle timeout, health checks, and per-user session limits - Refactor terminal.ts to route SSH state through session manager - Frontend tracks session IDs in localStorage for reconnection - Tabs persist to localStorage and restore on page reload - Add GET/POST /terminal/session_settings API endpoints - Clear session storage on logout * fix: resolve session persistence bugs found during code review - Fix detachWs timeout leak on double-detach (clear existing timeout first) - Fix healthCheck mutating Map during iteration (collect IDs first) - Capture sessionId at stream bind time to prevent cross-session data leakage - Add session destruction in OPKSSH/auth error paths that previously leaked - Add session destruction in shell init early-return paths - Reset isConnecting flag in attachSession handler - Use current terminal dimensions in sessionExpired handler (not stale closure) - Fix nextTabId race condition with synchronous initialization from restored tabs - Validate restored currentTab against actual restored tabs - Add clearTermixSessionStorage to logout error path * fix: correct raw SQL field name mismatches in crypto and credential routes (#601) Fix camelCase/snake_case mismatches left after #598 schema refactor: - credentials.ts: 5 remaining snake_case fields in Drizzle insert/update - data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns snake_case columns, causing undefined values and silent data loss - lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword), migrateRecordSensitiveFields() now uses propertyToColumn() to resolve snake_case keys from raw SQL results * feat: add per-host SSH keepalive configuration (#603) * fix: correct raw SQL field name mismatches in crypto and credential routes Fix camelCase/snake_case mismatches left after #598 schema refactor: - credentials.ts: 5 remaining snake_case fields in Drizzle insert/update - data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns snake_case columns, causing undefined values and silent data loss - lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword), migrateRecordSensitiveFields() now uses propertyToColumn() to resolve snake_case keys from raw SQL results * feat: add per-host SSH keepalive configuration MikroTik and similar devices ignore SSH-level keepalive requests, causing ssh2 to disconnect after keepaliveCountMax unanswered pings (default: 30s × 4 = 120s). Add keepaliveInterval and keepaliveCountMax to terminalConfig, allowing per-host override. Users can set keepaliveInterval to 0 to disable SSH keepalives and rely on TCP keepalive instead. Backend reads the values from hostConfig.terminalConfig sent via WebSocket. Frontend exposes the settings in the Advanced section of the terminal configuration tab. * fix: enable Electron desktop app to run standalone with embedded backend (#609) * fix: enable Electron desktop app to run standalone with embedded backend The Electron app already starts an embedded backend server via fork(), but the frontend had no awareness of it. On first launch, users were always prompted to enter a remote server URL even though a local backend was already running on localhost. - Add getEmbeddedServerStatus() to query the embedded backend via IPC - Add embeddedMode flag in main-axios.ts, detected at initialization - In embedded mode without a configured remote URL, getApiUrl() now routes each service to its own localhost port (30001, 30003, etc.) matching the dev-mode multi-port strategy - Auth.tsx checkServerConfig() detects embedded backend and skips the server configuration form, falling through to the standard login UI * fix: add explicit "Use Local Server" button and improve embedded detection The silent auto-detection of the embedded backend can fail due to IPC timing issues or backend startup failures. Add a visible "Use Local Server" button on the Server Configuration page that: - Probes http://localhost:30001/health to verify the backend is running - Sets embeddedMode and reinitializes API instances with per-port routing - Falls through to the standard login form (no iframe needed) Also adds setEmbeddedMode() export so the UI can explicitly activate embedded mode, and adds i18n keys for the new UI elements. * fix: disable asar for embedded backend, improve tray and health probe The forked backend process uses ESM imports and cannot resolve modules from inside an asar archive (NODE_PATH is CJS-only). Disabling asar ensures node_modules are plain files accessible to the backend. - Disable asar packaging so forked backend can resolve ESM imports - Remove node_modules exclusion from files config - Fix system tray: use nativeImage with template on macOS, add error handling, only minimize-to-tray when tray exists - Add retry mechanism for backend health probe (10 retries over ~30s) to handle slow backend startup - Always show "Use Local Server" button in Electron mode regardless of backend running status - Add file logging to userData for debugging GUI-launched app * feat: unified proxy + jump host pipeline with HTTP CONNECT support (#608) * fix: unify proxy and jump host connection paths SOCKS5 proxy and jump host logic were mutually exclusive — the SOCKS5 branch returned early, so jump hosts were never reached when both were configured. This affected terminal, file-manager, docker, and server-stats modules. Refactored all four modules to a unified pipeline: - createJumpHostChain() accepts optional socks5Config parameter - When both proxy and jump hosts are configured, the proxy socket is created to the first jump host internally, then used as transport - Three-branch flow: jumpHosts (with optional proxy) → proxy-only → direct - Enhanced error logging with hopIndex, totalHops, previousHop fields * feat: add HTTP CONNECT proxy support with mixed chain Extend ProxyNode.type to support 'http' alongside SOCKS4/5. New proxy-helper.ts provides: - createHttpConnectConnection(): HTTP CONNECT tunnel with Basic auth and optional existingSocket for chaining - createMixedProxyChainConnection(): routes each hop to SOCKS or HTTP CONNECT based on node type; pure-SOCKS chains still use the optimized SocksClient.createConnectionChain path - createProxyConnection(): unified entry point (backward-compatible alias for createSocks5Connection) - testProxyConnectivity(): connect through proxy to test target, measure latency socks5-helper.ts becomes a re-export shim — all existing import sites continue to work unchanged. * feat: add proxy connectivity test endpoint New POST /ssh/db/proxy/test API accepts singleProxy, proxyChain, and optional testTarget. Calls testProxyConnectivity() and returns success/latencyMs or error. Frontend testProxyConnection() function added to main-axios.ts. * feat: add connection path visualization and HTTP CONNECT UI - Proxy chain type selector now includes HTTP CONNECT option - Test Connection button calls /ssh/db/proxy/test with loading state - Connection path visualization shows the full route when proxy and/or jump hosts are configured: [You] → [Proxy] → [Jump Host] → [Target] - New i18n keys: httpConnect, testProxy, testingProxy, proxyTestSuccess, proxyTestFailed, connectionPath * fix: add Cache-Control no-store header to all API responses (#607) Backend API responses had no Cache-Control headers, making them vulnerable to caching by intermediate reverse proxies. This could cause stale data in the UI when Termix is deployed behind certain proxy configurations (e.g., SWAG, Pangolin). Add Cache-Control: no-store middleware to all 6 Express apps to prevent any proxy or browser from caching API responses. * fix: preserve external reverse proxy X-Forwarded headers in internal Nginx (#606) The internal Nginx proxy was overwriting X-Forwarded-Proto, X-Forwarded-Host, and X-Forwarded-Port with local values ($scheme, $http_host, $server_port), discarding headers set by the external reverse proxy. This caused getRequestOrigin() to always return http:// with the internal port for OpkSSH authentication URLs. Add map directives to preserve original X-Forwarded-* headers from the external proxy, falling back to local values when no external proxy is present. Also remove duplicate header directives in the WebSocket location. * fix: host update fails silently due to statsConfig double-serialization (#605) - Fix statsConfig double JSON.stringify in both frontend (createSSHHost, updateSSHHost) and backend (POST/PUT handlers). Frontend was pre- stringifying statsConfig before sending, then backend stringified again, corrupting the data after multiple edits and eventually causing Zod validation failures on the edit form. - Add missing sudoPassword field to createSSHHost and updateSSHHost submit data, which was being set in onSubmit but dropped during API call construction. - Add toast notification in handleFormError so users get visible feedback when form validation fails instead of silent no-op. * fix: Ctrl+C copies selection and clipboard error feedback (#604) * fix: correct raw SQL field name mismatches in crypto and credential routes Fix camelCase/snake_case mismatches left after #598 schema refactor: - credentials.ts: 5 remaining snake_case fields in Drizzle insert/update - data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns snake_case columns, causing undefined values and silent data loss - lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword), migrateRecordSensitiveFields() now uses propertyToColumn() to resolve snake_case keys from raw SQL results * fix: Ctrl+C copies selection instead of sending SIGINT when text is selected When terminal has an active text selection, Ctrl+C now copies the selected text to clipboard and clears the selection. When nothing is selected, Ctrl+C sends SIGINT as before. Ctrl+Shift+C continues to work as a dedicated copy shortcut. Also adds toast notifications when clipboard operations fail instead of silently swallowing errors. Applied to both the main terminal and Docker console terminal. * fix: improve IPv6 connection handling with bracket stripping and ENETUNREACH hint (#602) Strip square brackets from IPv6 addresses at all SSH connection entry points (terminal, docker, docker-console, file-manager, server-stats, tunnel) to handle addresses entered as [::1] format. Add ENETUNREACH error hint in terminal.ts that detects IPv6 addresses and suggests checking Docker IPv6 network configuration. Also fix remaining snake_case field names in credentials.ts (same as #601). * fix: backend catch error * feat: improve selection UI * fix: remove tab naming * fix: squished ssh toolbar split ui buttons * feat: improve persistent tabs, data not saving for users, various ui inconsistencies * fix: tab context creating random context errors * fix: improve terminal session logic (not perfect)s * fix: terminal session logic creating errors and electron app not having UI to do local mode * fix: desktop build error * feat: update readme * feat: update readme * feat: update readme * Update README.md (#612) * fix: macos build failure and updated rest of the langs for readme * feat: update readmes to fix spelling error * feat: update readmes to fix spelling error * fix: oidc failures, opkssh not wokring, added some qol to selecting * fix: buyild erorr * fix: buyild erorr * fix: macos build error * fix: opkssh, macos copy/paste, admin settings global default backend crashes, oidc redirect issues, updated translations * chore: clean up files * fix: oidc http/https redirect issue * fix: build error * feat: update json import with all new fields --------- Co-authored-by: skyam25 <simonkyam@gmail.com> Co-authored-by: ZacharyZcR <PayasoNorahC@protonmail.com> Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> Co-authored-by: Deepansh Khurana <deepanshkhurana@outlook.com> Co-authored-by: Dylan Ysmal <Xenthys@users.noreply.github.com> Co-authored-by: TomyJan <TomyJan6@gmail.com> Co-authored-by: ywaf <52742690+ywaf@users.noreply.github.com>
2666 lines
170 KiB
JSON
2666 lines
170 KiB
JSON
{
|
|
"credentials": {
|
|
"credentialsViewer": "عارض وثائق التفويض",
|
|
"manageYourSSHCredentials": "إدارة بيانات اعتماد SSH الخاصة بك بشكل آمن",
|
|
"addCredential": "إضافة بيانات اعتماد",
|
|
"createCredential": "إنشاء بيانات الاعتماد",
|
|
"editCredential": "تحرير بيانات الاعتماد",
|
|
"viewCredential": "عرض بيانات الاعتماد",
|
|
"duplicateCredential": "تكرار بيانات الاعتماد",
|
|
"deleteCredential": "حذف بيانات الاعتماد",
|
|
"updateCredential": "تحديث بيانات الاعتماد",
|
|
"credentialName": "اسم الاعتماد",
|
|
"credentialDescription": "الوصف",
|
|
"username": "اسم المستخدم",
|
|
"searchCredentials": "البحث عن بيانات التفويض...",
|
|
"selectFolder": "حدد مجلد",
|
|
"selectAuthType": "حدد نوع المصادقة",
|
|
"allFolders": "جميع المجلدات",
|
|
"allAuthTypes": "جميع أنواع المصادقة",
|
|
"uncategorized": "غير مصنف",
|
|
"totalCredentials": "المجموع",
|
|
"keyBased": "مبني على المفتاح",
|
|
"passwordBased": "مبني على كلمة المرور",
|
|
"folders": "مجلدات",
|
|
"noCredentialsMatchFilters": "لا توجد بيانات اعتماد مطابقة للفلاتر الخاصة بك",
|
|
"noCredentialsYet": "لم يتم إنشاء بيانات اعتماد بعد",
|
|
"createFirstCredential": "إنشاء بيانات الاعتماد الأولى الخاصة بك",
|
|
"failedToFetchCredentials": "فشل في جلب بيانات الاعتماد",
|
|
"credentialDeletedSuccessfully": "تم حذف بيانات الاعتماد بنجاح",
|
|
"failedToDeleteCredential": "فشل في حذف بيانات الاعتماد",
|
|
"confirmDeleteCredential": "هل أنت متأكد من أنك تريد حذف بيانات الاعتماد\"{{name}}\"؟",
|
|
"credentialCreatedSuccessfully": "تم إنشاء بيانات الاعتماد بنجاح",
|
|
"credentialUpdatedSuccessfully": "تم تحديث بيانات الاعتماد بنجاح",
|
|
"failedToSaveCredential": "فشل في حفظ بيانات الاعتماد",
|
|
"failedToFetchCredentialDetails": "فشل في جلب تفاصيل الاعتماد",
|
|
"failedToFetchHostsUsing": "فشل جلب المضيفين باستخدام هذا الاعتماد",
|
|
"loadingCredentials": "جاري تحميل البيانات...",
|
|
"retry": "إعادة المحاولة",
|
|
"noCredentials": "لا توجد وثائق اعتماد",
|
|
"noCredentialsMessage": "لم تقم بإضافة أي بيانات اعتماد حتى الآن. انقر فوق \"إضافة بيانات اعتماد\" للبدء.",
|
|
"sshCredentials": "بيانات اعتماد SSH",
|
|
"credentialsCount": "بيانات اعتماد {{count}}",
|
|
"refresh": "تحديث",
|
|
"passwordRequired": "كلمة المرور مطلوبة",
|
|
"sshKeyRequired": "مفتاح SSH مطلوب",
|
|
"credentialAddedSuccessfully": "تم إضافة بيانات الاعتماد \"{{name}}بنجاح",
|
|
"savingCredential": "حفظ الاعتماد...",
|
|
"updatingCredential": "جارٍ تحديث بيانات الاعتماد...",
|
|
"general": "عام",
|
|
"description": "الوصف",
|
|
"folder": "مجلد",
|
|
"tags": "الوسوم",
|
|
"addTagsSpaceToAdd": "إضافة وسوم (اضغط على مساحة للإضافة)",
|
|
"password": "كلمة المرور",
|
|
"key": "المفتاح",
|
|
"sshPrivateKey": "مفتاح SSH الخاص",
|
|
"upload": "تحميل",
|
|
"updateKey": "تحديث المفتاح",
|
|
"keyPassword": "كلمة المرور الرئيسية",
|
|
"keyType": "نوع المفتاح",
|
|
"keyTypeRSA": "RSA",
|
|
"keyTypeECDSA": "ECDSA",
|
|
"keyTypeEd25519": "Ed25519",
|
|
"basicInfo": "معلومات أساسية",
|
|
"authentication": "المصادقة",
|
|
"organization": "المنظمة",
|
|
"basicInformation": "معلومات أساسية",
|
|
"basicInformationDescription": "أدخل المعلومات الأساسية لهذا الاعتماد",
|
|
"authenticationMethod": "طريقة المصادقة",
|
|
"authenticationMethodDescription": "اختر كيف تريد المصادقة مع خوادم SSH",
|
|
"organizationDescription": "تنظيم بيانات الاعتماد الخاصة بك مع المجلدات والعلامات",
|
|
"enterCredentialName": "أدخل اسم الاعتماد",
|
|
"enterCredentialDescription": "أدخل الوصف (اختياري)",
|
|
"enterUsername": "أدخل اسم المستخدم",
|
|
"nameIsRequired": "اسم الاعتماد مطلوب",
|
|
"usernameIsRequired": "اسم المستخدم مطلوب",
|
|
"authenticationType": "نوع المصادقة",
|
|
"passwordAuthDescription": "استخدام مصادقة كلمة المرور",
|
|
"sshKeyAuthDescription": "استخدام مصادقة مفتاح SSH",
|
|
"passwordIsRequired": "كلمة المرور مطلوبة",
|
|
"sshKeyIsRequired": "مفتاح SSH مطلوب",
|
|
"sshKeyType": "نوع مفتاح SSH",
|
|
"privateKey": "المفتاح الخاص",
|
|
"enterPassword": "أدخل كلمة المرور",
|
|
"enterPrivateKey": "أدخل المفتاح الخاص",
|
|
"keyPassphrase": "كلمة المرور الرئيسية",
|
|
"enterKeyPassphrase": "أدخل كلمة مرور المفتاح (اختياري)",
|
|
"keyPassphraseOptional": "اختياري: اتركه فارغاً إذا كان المفتاح الخاص بك لا يحتوي على عبارة مرور",
|
|
"leaveEmptyToKeepCurrent": "اتركه فارغاً للحفاظ على القيمة الحالية",
|
|
"uploadKeyFile": "تحميل ملف المفتاح",
|
|
"generateKeyPairButton": "إنشاء اقتران المفتاح",
|
|
"generateKeyPair": "إنشاء اقتران المفتاح",
|
|
"generateKeyPairDescription": "إنشاء زوج مفتاح SSH جديد. إذا كنت ترغب في حماية المفتاح مع عبارة مرور، قم بإدخاله في حقل كلمة المرور الرئيسية أدناه أولاً.",
|
|
"deploySSHKey": "نشر مفتاح SSH",
|
|
"deploySSHKeyDescription": "نشر المفتاح العمومي إلى الخادم المستهدف",
|
|
"sourceCredential": "بيانات الاعتماد المصدر",
|
|
"targetHost": "المضيف المستهدف",
|
|
"deploymentProcess": "عملية النشر",
|
|
"deploymentProcessDescription": "سيؤدي هذا بأمان إلى إضافة المفتاح العمومي إلى ملف المضيف الهدف ~/.ssh/authorized_keyys دون الكتابة فوق المفاتيح الموجودة. العملية قابلة للرجوع عنها.",
|
|
"chooseHostToDeploy": "اختر مضيف ليقوم بنشره إلى...",
|
|
"deploying": "النشر...",
|
|
"name": "الاسم",
|
|
"noHostsAvailable": "لا يوجد مضيفين متاحين",
|
|
"noHostsMatchSearch": "لا يوجد مضيف يطابق بحثك",
|
|
"sshKeyGenerationNotImplemented": "ميزة توليد مفتاح SSH قريبا",
|
|
"connectionTestingNotImplemented": "ميزة اختبار الاتصال قريباً",
|
|
"testConnection": "اختبار الاتصال",
|
|
"selectOrCreateFolder": "تحديد أو إنشاء مجلد",
|
|
"noFolder": "لا يوجد مجلد",
|
|
"orCreateNewFolder": "أو إنشاء مجلد جديد",
|
|
"addTag": "إضافة علامة",
|
|
"saving": "حفظ...",
|
|
"credentialId": "معرف الاعتماد",
|
|
"overview": "نظرة عامة",
|
|
"security": "أمان",
|
|
"usage": "الاستخدام",
|
|
"securityDetails": "تفاصيل الأمان",
|
|
"securityDetailsDescription": "عرض معلومات الاعتماد المشفرة",
|
|
"credentialSecured": "بيانات الاعتماد المؤمنة",
|
|
"credentialSecuredDescription": "يتم تشفير جميع البيانات الحساسة باستخدام AES-256",
|
|
"passwordAuthentication": "مصادقة كلمة المرور",
|
|
"keyAuthentication": "المصادقة الرئيسية",
|
|
"securityReminder": "تذكير الأمان",
|
|
"securityReminderText": "لا تشارك بيانات الاعتماد الخاصة بك. يتم تشفير جميع البيانات عند الاستحقاق.",
|
|
"hostsUsingCredential": "المضيفين باستخدام بيانات الاعتماد هذه",
|
|
"noHostsUsingCredential": "لا يوجد مضيفين يستخدمون هذا الاعتماد حاليا",
|
|
"timesUsed": "الأوقات المستخدمة",
|
|
"lastUsed": "آخر استخدام",
|
|
"connectedHosts": "المُستضيفين المتصلين",
|
|
"created": "أنشئ",
|
|
"lastModified": "آخر تعديل",
|
|
"usageStatistics": "إحصائيات الاستخدام",
|
|
"copiedToClipboard": "تم نسخ {{field}} إلى الحافظة",
|
|
"failedToCopy": "فشل النسخ إلى الحافظة",
|
|
"sshKey": "مفتاح SSH",
|
|
"createCredentialDescription": "إنشاء اعتماد SSH جديد للوصول الآمن",
|
|
"editCredentialDescription": "تحديث معلومات الاعتماد",
|
|
"listView": "قائمة",
|
|
"folderView": "مجلدات",
|
|
"unknownCredential": "غير معروف",
|
|
"confirmRemoveFromFolder": "هل أنت متأكد من أنك تريد إزالة \"{{name}}\" من المجلد \"{{folder}}\"؟ سيتم نقل بيانات الاعتماد إلى \"إلغاء التصنيف\".",
|
|
"removedFromFolder": "بيانات الاعتماد \"{{name}}\" تمت إزالتها من المجلد بنجاح",
|
|
"failedToRemoveFromFolder": "فشل في إزالة بيانات الاعتماد من المجلد",
|
|
"folderRenamed": "المجلد \"{{oldName}}\" أعيدت تسميته إلى \"{{newName}}\" بنجاح",
|
|
"failedToRenameFolder": "فشل في إعادة تسمية المجلد",
|
|
"movedToFolder": "تم نقل الاعتماد \"{{name}}\" إلى \"{{folder}}\" بنجاح",
|
|
"failedToMoveToFolder": "فشل نقل بيانات الاعتماد إلى المجلد",
|
|
"sshPublicKey": "مفتاح SSH العام",
|
|
"publicKeyNote": "المفتاح العمومي اختياري ولكن يوصى بالتحقق من صحة المفتاح",
|
|
"publicKeyUploaded": "تم تحميل المفتاح العام",
|
|
"uploadPublicKey": "تحميل المفتاح العام",
|
|
"uploadPrivateKeyFile": "تحميل ملف المفتاح الخاص",
|
|
"uploadPublicKeyFile": "تحميل ملف المفتاح العام",
|
|
"privateKeyRequiredForGeneration": "المفتاح الخاص مطلوب لإنشاء المفتاح العمومي",
|
|
"failedToGeneratePublicKey": "فشل في إنشاء المفتاح العمومي",
|
|
"generatePublicKey": "توليد من المفتاح الخاص",
|
|
"publicKeyGeneratedSuccessfully": "تم إنشاء المفتاح العام بنجاح",
|
|
"detectedKeyType": "نوع المفتاح المكتشف",
|
|
"detectingKeyType": "اكتشف...",
|
|
"optional": "اختياري",
|
|
"generateKeyPairNew": "إنشاء اقتران مفتاح جديد",
|
|
"generateEd25519": "إنشاء Ed25519",
|
|
"generateECDSA": "إنشاء ECDSA",
|
|
"generateRSA": "إنشاء RSA",
|
|
"keyTypeEcdsaP256": "ECDSA P-256 (SSH)",
|
|
"keyTypeEcdsaP384": "ECDSA P-384 (SSH)",
|
|
"keyTypeEcdsaP521": "ECDSA P-521 (SSH)",
|
|
"keyTypeDsa": "DSA (SSH)",
|
|
"keyTypeRsaSha256": "RSA-SHA2-256",
|
|
"keyTypeRsaSha512": "RSA-SHA2-512",
|
|
"keyPairGeneratedSuccessfully": "تم إنشاء زوج المفتاح {{keyType}} بنجاح",
|
|
"failedToGenerateKeyPair": "فشل في إنشاء زوج المفاتيح",
|
|
"generateKeyPairNote": "إنشاء زوج جديد من مفاتيح SSH مباشرة. هذا سيحل محل أي مفاتيح موجودة في النموذج.",
|
|
"invalidKey": "مفتاح غير صالح",
|
|
"detectionError": "خطأ في الكشف",
|
|
"removing": "إزالة:",
|
|
"clickToEditCredential": "انقر لتعديل بيانات الاعتماد",
|
|
"dragToMoveBetweenFolders": "اسحب للانتقال بين المجلدات",
|
|
"keyBasedOnlyForDeployment": "يمكن نشر بيانات الاعتماد الرئيسية فقط SSH",
|
|
"publicKeyRequiredForDeployment": "المفتاح العمومي مطلوب للنشر",
|
|
"selectTargetHost": "الرجاء تحديد المضيف المستهدف",
|
|
"keyDeployedSuccessfully": "تم نشر مفتاح SSH بنجاح",
|
|
"deploymentFailed": "فشل النشر",
|
|
"failedToDeployKey": "فشل نشر مفتاح SSH",
|
|
"clickToRenameFolder": "انقر لإعادة تسمية المجلد",
|
|
"renameFolder": "إعادة تسمية المجلد",
|
|
"idLabel": "ID:"
|
|
},
|
|
"quickConnect": {
|
|
"title": "الاتصال السريع",
|
|
"description": "الاتصال مباشرة بمحطة طرفية أو جلسة مدير ملفات دون حفظ تكوين المضيف",
|
|
"ipAddress": "عنوان IP أو اسم المضيف",
|
|
"port": "المنفذ",
|
|
"username": "اسم المستخدم",
|
|
"password": "كلمة المرور",
|
|
"key": "مفتاح SSH الخاص",
|
|
"keyPassword": "كلمة المرور الرئيسية (اختياري)",
|
|
"keyType": "نوع المفتاح",
|
|
"uploadFile": "تحميل ملف",
|
|
"pasteKey": "لصق المفتاح",
|
|
"credential": "بيانات",
|
|
"overrideUsername": "تجاوز اسم المستخدم",
|
|
"overrideUsernameDesc": "استخدام اسم مستخدم مختلف عن اسم المستخدم المخزن في بيانات الاعتماد",
|
|
"connectTerminal": "الاتصال بالمحطة الطرفية",
|
|
"connectFileManager": "الاتصال بمدير الملفات",
|
|
"cancel": "إلغاء",
|
|
"passwordRequired": "كلمة المرور مطلوبة",
|
|
"keyRequired": "مفتاح SSH مطلوب",
|
|
"credentialRequired": "اختيار الاعتماد مطلوب",
|
|
"connectionEstablished": "تم إنشاء الاتصال بنجاح",
|
|
"connectionFailed": "فشل في إنشاء الاتصال",
|
|
"autoDetect": "الكشف التلقائي",
|
|
"authentication": "المصادقة"
|
|
},
|
|
"dragIndicator": {
|
|
"error": "خطأ: {{error}}",
|
|
"dragging": "سحب {{fileName}}",
|
|
"preparing": "تحضير {{fileName}}",
|
|
"readySingle": "جاهز للتنزيل {{fileName}}",
|
|
"readyMultiple": "جاهز لتنزيل ملفات {{count}}",
|
|
"batchDrag": "اسحب الملفات {{count}} إلى سطح المكتب",
|
|
"dragToDesktop": "اسحب إلى سطح المكتب",
|
|
"canDragAnywhere": "يمكنك سحب الملفات في أي مكان على سطح المكتب الخاص بك"
|
|
},
|
|
"sshTools": {
|
|
"title": "أدوات SSH",
|
|
"closeTools": "إغلاق أدوات SSH",
|
|
"keyRecording": "تسجيل المفتاح",
|
|
"startKeyRecording": "بدء تسجيل المفتاح",
|
|
"stopKeyRecording": "إيقاف تسجيل المفتاح",
|
|
"selectTerminals": "حدد طرفات:",
|
|
"typeCommands": "اكتب الأوامر (جميع المفاتيح مدعومة):",
|
|
"commandsWillBeSent": "سيتم إرسال الأوامر إلى المحطة الطرفية المحددة {{count}}.",
|
|
"settings": "الإعدادات",
|
|
"enableRightClickCopyPaste": "تمكين النقر بالزر الأيمن نسخ/لصق",
|
|
"shareIdeas": "هل لديك أفكار حول ما يجب أن يأتي بعد أدوات ssh؟ مشاركتهم على",
|
|
"scripts": {
|
|
"inputPlaceholder": "على سبيل المثال أوامر النظام، سكريبتات Docker"
|
|
}
|
|
},
|
|
"snippets": {
|
|
"title": "كتل الكود",
|
|
"new": "كتلة جديدة",
|
|
"create": "إنشاء كتلة كتلة",
|
|
"edit": "تعديل كتلة الكود",
|
|
"run": "تشغيل",
|
|
"empty": "لا يوجد كتل كتلة حتى الآن",
|
|
"emptyHint": "إنشاء كتلة كود لحفظ الأوامر الشائعة الاستخدام",
|
|
"searchSnippets": "البحث عن كتل الكود...",
|
|
"name": "الاسم",
|
|
"description": "الوصف",
|
|
"content": "أمر",
|
|
"namePlaceholder": "على سبيل المثال، إعادة تشغيل Nginx",
|
|
"descriptionPlaceholder": "وصف اختياري",
|
|
"contentPlaceholder": "على سبيل المثال, sudo systemctl إعادة تشغيل nginx",
|
|
"nameRequired": "الاسم مطلوب",
|
|
"contentRequired": "الأمر مطلوب",
|
|
"createDescription": "إنشاء كتلة أوامر جديدة للتنفيذ السريع",
|
|
"editDescription": "تعديل كتلة الأوامر",
|
|
"deleteConfirmTitle": "حذف كتلة الكود",
|
|
"deleteConfirmDescription": "هل أنت متأكد من أنك تريد حذف \"{{name}}\"؟",
|
|
"createSuccess": "تم إنشاء كتلة الكود بنجاح",
|
|
"updateSuccess": "تم تحديث كتلة الكود بنجاح",
|
|
"deleteSuccess": "تم حذف كتلة الكود بنجاح",
|
|
"createFailed": "فشل في إنشاء كتلة الكود",
|
|
"updateFailed": "فشل تحديث كتلة الكود",
|
|
"deleteFailed": "فشل حذف كتلة الكود",
|
|
"failedToFetch": "فشل في جلب كتل الكود",
|
|
"executeSuccess": "التنفيذ: {{name}}",
|
|
"copySuccess": "تم نسخ \"{{name}}\" إلى الحافظة",
|
|
"runTooltip": "تنفيذ هذه الكتلة في المحطة الطرفية",
|
|
"copyTooltip": "نسخ كتلة الكود إلى الحافظة",
|
|
"editTooltip": "تعديل كتلة الكود هذه",
|
|
"deleteTooltip": "حذف هذه الكتلة",
|
|
"newFolder": "مجلد جديد",
|
|
"reorderSameFolder": "يمكن فقط إعادة ترتيب كتل الكود داخل نفس المجلد",
|
|
"reorderSuccess": "تم إعادة ترتيب الكتل بنجاح",
|
|
"reorderFailed": "فشل إعادة ترتيب كتل الكود",
|
|
"deleteFolderConfirm": "حذف المجلد\"{{name}}\"؟ سيتم نقل جميع كتل الكود إلى إلغاء التصنيف.",
|
|
"deleteFolderSuccess": "تم حذف المجلد بنجاح",
|
|
"deleteFolderFailed": "فشل في حذف المجلد",
|
|
"updateFolderSuccess": "تم تحديث المجلد بنجاح",
|
|
"createFolderSuccess": "تم إنشاء المجلد بنجاح",
|
|
"updateFolderFailed": "فشل تحديث المجلد",
|
|
"createFolderFailed": "فشل في إنشاء المجلد",
|
|
"selectTerminals": "حدد المحطات الطرفية (اختياري)",
|
|
"executeOnSelected": "تنفيذ على المحطة الطرفية المحددة {{count}}",
|
|
"executeOnCurrent": "تنفيذ على المحطة الطرفية الحالية (انقر لتحديد متعدد)",
|
|
"folder": "مجلد",
|
|
"selectFolder": "حدد مجلد أو اتركه فارغاً",
|
|
"noFolder": "لا يوجد مجلد (غير مصنف)",
|
|
"folderName": "اسم المجلد",
|
|
"folderNameRequired": "اسم المجلد مطلوب",
|
|
"folderColor": "لون المجلد",
|
|
"folderIcon": "أيقونة المجلد",
|
|
"preview": "معاينة",
|
|
"updateFolder": "تحديث المجلد",
|
|
"createFolder": "إنشاء مجلد",
|
|
"editFolder": "تعديل المجلد",
|
|
"editFolderDescription": "تخصيص مجلد كتلة الكود",
|
|
"createFolderDescription": "تنظيم كتل الكتل في مجلدات"
|
|
},
|
|
"commandHistory": {
|
|
"title": "التاريخ",
|
|
"searchPlaceholder": "ابحث في الأوامر...",
|
|
"noTerminal": "لا توجد محطة طرفية نشطة",
|
|
"noTerminalHint": "افتح محطة طرفية لمشاهدة سجل الأوامر الخاص بها.",
|
|
"empty": "لا يوجد تاريخ أمر بعد",
|
|
"emptyHint": "تنفيذ الأوامر في المحطة الطرفية النشطة لبناء تاريخها.",
|
|
"noResults": "لم يتم العثور على أوامر",
|
|
"noResultsHint": "لا توجد أوامر مطابقة \"{{query}}\"",
|
|
"deleteSuccess": "تم حذف الأمر من السجل",
|
|
"deleteFailed": "فشل في حذف الأمر.",
|
|
"deleteTooltip": "حذف الأمر",
|
|
"tabHint": "استخدم علامة التبويب في المحطة الطرفية للإكمال التلقائي من سجل الأوامر إذا تم تمكينها في الملف الشخصي للمستخدم",
|
|
"authRequiredRefresh": "المصادقة مطلوبة. الرجاء تحديث الصفحة.",
|
|
"dataAccessLockedReauth": "تم تأمين الوصول إلى البيانات. الرجاء إعادة المصادقة.",
|
|
"loading": "جاري تحميل سجل الأوامر...",
|
|
"error": "خطأ في تحميل المحفوظات"
|
|
},
|
|
"splitScreen": {
|
|
"title": "تقسيم الشاشة",
|
|
"none": "لا",
|
|
"twoSplit": "طريقتان",
|
|
"threeSplit": "3-طريق",
|
|
"fourSplit": "4-طريق",
|
|
"availableTabs": "علامات التبويب المتاحة",
|
|
"dragTabsHint": "اسحب علامات التبويب إلى خلايا التخطيط أدناه لتعيينها",
|
|
"layout": "تقسيم تخطيط الشاشة",
|
|
"dropHere": "إسقاط علامة التبويب هنا",
|
|
"apply": "تطبيق التقسيم",
|
|
"clear": "مسح التقسيم",
|
|
"selectMode": "حدد وضع تقسيم الشاشة",
|
|
"helpText": "اختر عدد علامات التبويب التي تريد عرضها مرة واحدة",
|
|
"success": "تم تطبيق تقسيم الشاشة بنجاح",
|
|
"cleared": "تمّ مسح تقسيم الشاشة",
|
|
"error": {
|
|
"noAssignments": "الرجاء تعيين علامة تبويب واحدة على الأقل للتخطيط",
|
|
"fillAllSlots": "يرجى ملء جميع فتحات {{count}} قبل تقديم الطلب"
|
|
}
|
|
},
|
|
"homepage": {
|
|
"loggedInTitle": "تسجيل الدخول!",
|
|
"loggedInMessage": "أنت مسجل الدخول! استخدم الشريط الجانبي للوصول إلى جميع الأدوات المتاحة. للبدء، قم بإنشاء مضيف SSH في علامة تبويب مدير SSH. بمجرد إنشائها، يمكنك الاتصال بهذا المضيف باستخدام التطبيقات الأخرى في الشريط الجانبي.",
|
|
"failedToLoadAlerts": "فشل تحميل التنبيهات",
|
|
"failedToDismissAlert": "فشل في تجاهل التنبيه"
|
|
},
|
|
"serverConfig": {
|
|
"title": "تكوين الخادم",
|
|
"description": "تكوين عنوان URL للخادم Termix للاتصال بخدمات الخلفية",
|
|
"serverUrl": "رابط الخادم",
|
|
"enterServerUrl": "الرجاء إدخال رابط الخادم",
|
|
"testConnectionFirst": "يرجى اختبار الاتصال أولاً",
|
|
"connectionSuccess": "تم الاتصال بنجاح!",
|
|
"connectionFailed": "فشل الاتصال",
|
|
"connectionError": "حدث خطأ في الاتصال",
|
|
"connected": "متصل",
|
|
"disconnected": "قطع",
|
|
"configSaved": "تم حفظ الإعدادات بنجاح",
|
|
"saveFailed": "فشل في حفظ التكوين",
|
|
"saveError": "خطأ في حفظ الإعدادات",
|
|
"saving": "حفظ...",
|
|
"saveConfig": "حفظ الإعدادات",
|
|
"helpText": "أدخل عنوان URL حيث يعمل خادم Termix الخاص بك (على سبيل المثال: http://localhost:30001 أو https://your-server.com)",
|
|
"warning": "تحذير",
|
|
"notValidatedWarning": "لم يتم التحقق من صحة الرابط - تأكد من صحته",
|
|
"changeServer": "تغيير الخادم",
|
|
"mustIncludeProtocol": "عنوان URL للخادم يجب أن يبدأ مع http:// أو https://"
|
|
},
|
|
"versionCheck": {
|
|
"error": "خطأ في التحقق من الإصدار",
|
|
"checkFailed": "فشل التحقق من وجود تحديثات",
|
|
"upToDate": "التطبيق يصل إلى تاريخ",
|
|
"currentVersion": "أنت تقوم بتشغيل الإصدار {{version}}",
|
|
"updateAvailable": "تحديث متوفر",
|
|
"newVersionAvailable": "يتوفر إصدار جديد! أنت تقوم بتشغيل {{current}}، ولكن {{latest}} متاح.",
|
|
"releasedOn": "صدر على {{date}}",
|
|
"downloadUpdate": "تنزيل التحديث",
|
|
"dismiss": "تجاهل",
|
|
"checking": "البحث عن تحديثات...",
|
|
"checkUpdates": "التحقق من وجود تحديثات",
|
|
"checkingUpdates": "البحث عن تحديثات...",
|
|
"refresh": "تحديث",
|
|
"updateRequired": "التحديث مطلوب",
|
|
"updateDismissed": "تم رفض إشعار التحديث",
|
|
"noUpdatesFound": "لم يتم العثور على تحديثات"
|
|
},
|
|
"common": {
|
|
"close": "أغلق",
|
|
"minimize": "Minimize",
|
|
"online": "متصل",
|
|
"offline": "غير متصل",
|
|
"continue": "متابعة",
|
|
"maintenance": "صيانة",
|
|
"degraded": "تدهورت",
|
|
"discord": "ديسكورد",
|
|
"error": "خطأ",
|
|
"warning": "تحذير",
|
|
"info": "معلومات",
|
|
"success": "نجاح",
|
|
"loading": "تحميل...",
|
|
"required": "مطلوب",
|
|
"optional": "اختياري",
|
|
"connect": "الاتصال",
|
|
"connecting": "جاري الاتصال...",
|
|
"creating": "إنشاء...",
|
|
"clear": "مسح",
|
|
"toggleSidebar": "تبديل الشريط الجانبي",
|
|
"sidebar": "Sidebar",
|
|
"home": "المنزل",
|
|
"expired": "منتهية",
|
|
"expiresToday": "تنتهي الصلاحية اليوم",
|
|
"expiresTomorrow": "ينتهي خلال {{days}} أيام",
|
|
"updateAvailable": "تحديث متوفر",
|
|
"sshPath": "مسار SSH",
|
|
"localPath": "المسار المحلي",
|
|
"appName": "تيريمكس",
|
|
"openInNewTab": "فتح في علامة تبويب جديدة",
|
|
"resetSidebarWidth": "Reset sidebar width",
|
|
"dragToResizeSidebar": "سحب لتغيير حجم الشريط الجانبي",
|
|
"noAuthCredentials": "لا توجد بيانات اعتماد مصادقة متاحة لمضيف SSH هذا",
|
|
"noReleases": "لا توجد إصدارات",
|
|
"updatesAndReleases": "التحديثات والإصدارات",
|
|
"newVersionAvailable": "يتوفر إصدار جديد ({{version}}).",
|
|
"failedToFetchUpdateInfo": "فشل في جلب معلومات التحديث",
|
|
"preRelease": "الإصدار السابق",
|
|
"loginFailed": "فشل تسجيل الدخول",
|
|
"noReleasesFound": "لم يتم العثور على إصدارات",
|
|
"yourBackupCodes": "رموز النسخ الاحتياطي",
|
|
"sendResetCode": "إرسال رمز إعادة التعيين",
|
|
"verifyCode": "التحقق من الرمز",
|
|
"resetPassword": "إعادة تعيين كلمة المرور",
|
|
"resetCode": "Reset Code",
|
|
"newPassword": "كلمة المرور الجديدة",
|
|
"folder": "مجلد",
|
|
"file": "ملف",
|
|
"renamedSuccessfully": "تمت إعادة التسمية بنجاح",
|
|
"deletedSuccessfully": "تم الحذف بنجاح",
|
|
"noTunnelConnections": "لا توجد اتصالات نفق تم تكوينها",
|
|
"sshTools": "أدوات SSH",
|
|
"english": "الإنكليزية",
|
|
"chinese": "الصينية",
|
|
"german": "الألمانية",
|
|
"cancel": "إلغاء",
|
|
"username": "اسم المستخدم",
|
|
"name": "الاسم",
|
|
"login": "تسجيل الدخول",
|
|
"logout": "تسجيل الخروج",
|
|
"register": "تسجيل",
|
|
"password": "كلمة المرور",
|
|
"version": "الإصدار",
|
|
"confirmPassword": "تأكيد كلمة المرور",
|
|
"back": "الرجوع",
|
|
"email": "البريد الإلكتروني",
|
|
"submit": "إرسال",
|
|
"change": "تغيير",
|
|
"save": "حفظ",
|
|
"saving": "حفظ...",
|
|
"delete": "حذف",
|
|
"edit": "تحرير",
|
|
"add": "إضافة",
|
|
"search": "البحث",
|
|
"confirm": "تأكيد",
|
|
"yes": "نعم",
|
|
"no": "لا",
|
|
"ok": "حسناً",
|
|
"enabled": "تمكين",
|
|
"disabled": "معطل",
|
|
"important": "مهم",
|
|
"notEnabled": "غير مفعل",
|
|
"settingUp": "جاري الإعداد...",
|
|
"next": "التالي",
|
|
"previous": "السابق",
|
|
"refresh": "تحديث",
|
|
"settings": "الإعدادات",
|
|
"profile": "الملف الشخصي",
|
|
"help": "مساعدة",
|
|
"about": "حول",
|
|
"language": "اللغة",
|
|
"autoDetect": "الكشف التلقائي",
|
|
"changeAccountPassword": "تغيير كلمة مرور حسابك",
|
|
"passwordResetTitle": "إعادة تعيين كلمة المرور",
|
|
"passwordResetDescription": "أنت على وشك إعادة تعيين كلمة المرور الخاصة بك. سيؤدي هذا إلى تسجيل خروجك من جميع الجلسات النشطة.",
|
|
"enterSixDigitCode": "أدخل الرمز المكون من 6 أرقام من سجلات حاويات الجهاز للمستخدم:",
|
|
"enterNewPassword": "أدخل كلمة المرور الجديدة للمستخدم:",
|
|
"passwordsDoNotMatch": "كلمتا المرور غير متطابقتين",
|
|
"passwordMinLength": "يجب أن تتكون كلمة المرور من 6 أحرف على الأقل",
|
|
"passwordResetSuccess": "تم إعادة تعيين كلمة المرور بنجاح! يمكنك الآن تسجيل الدخول باستخدام كلمة المرور الجديدة.",
|
|
"failedToInitiatePasswordReset": "فشل في بدء إعادة تعيين كلمة المرور",
|
|
"failedToVerifyResetCode": "فشل التحقق من إعادة تعيين الرمز",
|
|
"failedToCompletePasswordReset": "فشل في إكمال إعادة تعيين كلمة المرور",
|
|
"documentation": "الوثائق",
|
|
"retry": "إعادة المحاولة",
|
|
"checking": "يتحقق...",
|
|
"checkingDatabase": "التحقق من اتصال قاعدة البيانات...",
|
|
"checkingAuthentication": "التحقق من المصادقة...",
|
|
"actions": "الإجراءات",
|
|
"remove": "إزالة",
|
|
"revoke": "Revoke",
|
|
"create": "إنشاء",
|
|
"update": "تحديث"
|
|
},
|
|
"nav": {
|
|
"home": "المنزل",
|
|
"hosts": "المضيفون",
|
|
"credentials": "وثائق التفويض",
|
|
"terminal": "المحطة",
|
|
"docker": "دوكر",
|
|
"tunnels": "أنفاق",
|
|
"fileManager": "مدير الملفات",
|
|
"serverStats": "إحصائيات الخادم",
|
|
"admin": "المشرف",
|
|
"userProfile": "الملف الشخصي للمستخدم",
|
|
"tools": "أدوات",
|
|
"snippets": "كتل الكود",
|
|
"newTab": "New Tab",
|
|
"splitScreen": "تقسيم الشاشة",
|
|
"closeTab": "إغلاق علامة التبويب",
|
|
"sshManager": "مدير SSH",
|
|
"hostManager": "مدير المضيف",
|
|
"cannotSplitTab": "لا يمكن تقسيم هذا التبويب",
|
|
"tabNavigation": "Tab Navigation",
|
|
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
|
|
"copyPassword": "نسخ كلمة المرور",
|
|
"copySudoPassword": "نسخ كلمة مرور سودو",
|
|
"passwordCopied": "تم نسخ كلمة المرور إلى الحافظة",
|
|
"sudoPasswordCopied": "تم نسخ كلمة المرور إلى الحافظة",
|
|
"noPasswordAvailable": "لا توجد كلمة مرور متاحة"
|
|
},
|
|
"admin": {
|
|
"title": "إعدادات المدير",
|
|
"oidc": "OIDC",
|
|
"users": "المستخدمون",
|
|
"userManagement": "إدارة المستخدم",
|
|
"makeAdmin": "إنشاء مشرف",
|
|
"removeAdmin": "إزالة المشرف",
|
|
"deleteUser": "حذف المستخدم {{username}}؟ لا يمكن التراجع عن ذلك.",
|
|
"allowRegistration": "السماح للتسجيل",
|
|
"oidcSettings": "إعدادات OIDC",
|
|
"clientId": "معرف العميل",
|
|
"clientSecret": "سر العميل",
|
|
"issuerUrl": "رابط المصدر",
|
|
"authorizationUrl": "رابط التخويل",
|
|
"tokenUrl": "رابط الرمز المميز",
|
|
"updateSettings": "تحديث الإعدادات",
|
|
"confirmDelete": "هل أنت متأكد من أنك تريد حذف هذا المستخدم؟",
|
|
"confirmMakeAdmin": "هل أنت متأكد من رغبتك في جعل {{username}} مسؤولاً؟",
|
|
"confirmRemoveAdmin": "هل أنت متأكد من أنك تريد إزالة حالة المشرف من {{username}}؟",
|
|
"externalAuthentication": "المصادقة الخارجية (OIDC)",
|
|
"configureExternalProvider": "تكوين موفر الهوية الخارجي للمصادقة OIDC/OAuth2.",
|
|
"userIdentifierPath": "مسار معرف المستخدم",
|
|
"displayNamePath": "عرض مسار الاسم",
|
|
"scopes": "النطاقات",
|
|
"saving": "حفظ...",
|
|
"saveConfiguration": "حفظ الإعدادات",
|
|
"reset": "Reset",
|
|
"success": "نجاح",
|
|
"loading": "تحميل...",
|
|
"refresh": "تحديث",
|
|
"loadingUsers": "تحميل المستخدمين...",
|
|
"username": "اسم المستخدم",
|
|
"type": "نوع",
|
|
"actions": "الإجراءات",
|
|
"external": "خارجي",
|
|
"local": "محلي",
|
|
"adminManagement": "إدارة المدير",
|
|
"makeUserAdmin": "جعل المستخدم مشرف",
|
|
"adding": "إضافة...",
|
|
"currentAdmins": "المشرفون الحاليون",
|
|
"adminBadge": "المشرف",
|
|
"removeAdminButton": "إزالة المشرف",
|
|
"general": "عام",
|
|
"userRegistration": "تسجيل المستخدم",
|
|
"allowNewAccountRegistration": "السماح بتسجيل حساب جديد",
|
|
"allowPasswordLogin": "السماح باستخدام اسم المستخدم/كلمة المرور",
|
|
"allowPasswordReset": "السماح بإعادة تعيين كلمة المرور عن طريق رمز إعادة التعيين",
|
|
"missingRequiredFields": "الحقول المطلوبة مفقودة: {{fields}}",
|
|
"oidcConfigurationUpdated": "تم تحديث تكوين OIDC بنجاح!",
|
|
"failedToFetchOidcConfig": "فشل في جلب إعدادات OIDC",
|
|
"failedToFetchRegistrationStatus": "فشل في جلب حالة التسجيل",
|
|
"failedToFetchPasswordLoginStatus": "فشل في جلب حالة تسجيل الدخول لكلمة المرور",
|
|
"failedToFetchUsers": "فشل في جلب المستخدمين",
|
|
"oidcConfigurationDisabled": "تم تعطيل اعدادات OIDC بنجاح!",
|
|
"failedToUpdateOidcConfig": "فشل تحديث إعدادات OIDC",
|
|
"failedToDisableOidcConfig": "فشل تعطيل إعدادات OIDC",
|
|
"enterUsernameToMakeAdmin": "أدخل اسم المستخدم لجعل المشرف",
|
|
"userIsNowAdmin": "المستخدم {{username}} هو مشرف الآن",
|
|
"failedToMakeUserAdmin": "فشل في جعل مشرف المستخدم",
|
|
"removeAdminStatus": "إزالة حالة المشرف من {{username}}؟",
|
|
"adminStatusRemoved": "تمت إزالة حالة المشرف من {{username}}",
|
|
"failedToRemoveAdminStatus": "فشل في إزالة حالة المشرف",
|
|
"userDeletedSuccessfully": "تم حذف المستخدم {{username}} بنجاح",
|
|
"failedToDeleteUser": "فشل في حذف المستخدم",
|
|
"overrideUserInfoUrl": "تجاوز رابط معلومات المستخدم (غير مطلوب)",
|
|
"failedToFetchSessions": "فشل في جلب الجلسات",
|
|
"sessionRevokedSuccessfully": "تم إلغاء الجلسة بنجاح",
|
|
"failedToRevokeSession": "فشل في إلغاء الجلسة",
|
|
"confirmRevokeSession": "هل أنت متأكد من أنك تريد إلغاء هذه الجلسة؟",
|
|
"confirmRevokeAllSessions": "هل أنت متأكد من أنك تريد إلغاء جميع الجلسات لهذا المستخدم؟",
|
|
"failedToRevokeSessions": "فشل في إلغاء الجلسات",
|
|
"sessionsRevokedSuccessfully": "تم إلغاء الجلسات بنجاح",
|
|
"linkToPasswordAccount": "رابط لحساب كلمة المرور",
|
|
"linkOIDCDialogTitle": "ربط حساب OIDC بحساب كلمة المرور",
|
|
"linkOIDCDialogDescription": "ربط {{username}} مستخدم (OIDC) بحساب كلمة المرور الموجود. وهذا سيمكن المصادقة المزدوجة لحساب كلمة المرور.",
|
|
"createUser": "إنشاء مستخدم",
|
|
"createUserDescription": "إنشاء مستخدم محلي جديد مع اسم المستخدم وكلمة المرور",
|
|
"enterUsername": "أدخل اسم المستخدم",
|
|
"enterPassword": "أدخل كلمة المرور",
|
|
"userCreatedSuccessfully": "تم إنشاء المستخدم {{username}} بنجاح",
|
|
"failedToCreateUser": "فشل في إنشاء المستخدم",
|
|
"manageUser": "إدارة المستخدم",
|
|
"manageUserDescription": "إدارة إعدادات المستخدم والأدوار والأذونات",
|
|
"authType": "نوع المصادقة",
|
|
"adminStatus": "حالة المشرف",
|
|
"userId": "معرف المستخدم",
|
|
"regularUser": "مستخدم عادي",
|
|
"adminPrivileges": "امتيازات المدير",
|
|
"administratorRole": "دور المدير",
|
|
"administratorRoleDescription": "منح امتيازات كاملة للوصول إلى النظام وإدارتها",
|
|
"passwordManagement": "إدارة كلمة المرور",
|
|
"passwordResetWarning": "إعادة تعيين كلمة مرور المستخدم سيؤدي إلى حذف جميع بياناتهم (مستضيفي SH، بيانات الاعتماد، الإعدادات). لا يمكن التراجع عن هذا الإجراء.",
|
|
"resetUserPassword": "إعادة تعيين كلمة مرور المستخدم",
|
|
"resettingPassword": "إعادة تعيين...",
|
|
"passwordResetInitiated": "تم بدء إعادة تعيين كلمة المرور ل {{username}}. تم إرسال رمز إعادة التعيين.",
|
|
"failedToResetPassword": "فشل في بدء إعادة تعيين كلمة المرور",
|
|
"sessionManagement": "إدارة الجلسة",
|
|
"revokeAllSessions": "إلغاء جميع الجلسات",
|
|
"revokeAllSessionsDescription": "إجبار الخروج من جميع الأجهزة والجلسات",
|
|
"revoking": "إلغاء...",
|
|
"revoke": "إلغاء الكل",
|
|
"dangerZone": "منطقة الخطر",
|
|
"deleteUserTitle": "حذف حساب المستخدم",
|
|
"deleteUserWarning": "حذف حساب المستخدم هذا وكافة البيانات المرتبطة به بشكل دائم. لا يمكن التراجع عن هذا الإجراء.",
|
|
"deleting": "حذف...",
|
|
"cannotDeleteSelf": "لا يمكنك حذف حسابك الخاص",
|
|
"cannotRemoveLastAdmin": "لا يمكن إزالة المسؤول الأخير",
|
|
"cannotRemoveOwnAdmin": "لا يمكنك إزالة امتيازات المشرف الخاص بك",
|
|
"cannotModifyOwnAdminStatus": "لا يمكنك تعديل حالة المشرف الخاص بك",
|
|
"dualAuth": "المصادقة المزدوجة",
|
|
"externalOIDC": "خارجي (OIDC)",
|
|
"localPassword": "كلمة المرور المحلية",
|
|
"confirmRevokeOwnSessions": "هل أنت متأكد من أنك تريد إلغاء جميع جلساتك الخاصة؟ سيتم تسجيل الخروج.",
|
|
"linkOIDCWarningTitle": "تحذير: سيتم حذف بيانات المستخدم OIDC",
|
|
"linkOIDCActionDeleteUser": "حذف حساب مستخدم OIDC وجميع بياناتهم",
|
|
"linkOIDCActionAddCapability": "إضافة قدرة تسجيل الدخول OIDC إلى حساب كلمة المرور المستهدفة",
|
|
"linkOIDCActionDualAuth": "السماح لحساب كلمة المرور بتسجيل الدخول باستخدام كل من كلمة المرور و OIDC",
|
|
"linkTargetUsernameLabel": "اسم مستخدم حساب كلمة المرور الهدف",
|
|
"linkTargetUsernamePlaceholder": "أدخل اسم المستخدم لحساب كلمة المرور",
|
|
"linkAccountsButton": "ربط الحسابات",
|
|
"linkingAccounts": "ربط...",
|
|
"accountsLinkedSuccessfully": "تم ربط مستخدم OIDC {{oidcUsername}} بـ {{targetUsername}}",
|
|
"failedToLinkAccounts": "فشل في ربط الحسابات",
|
|
"linkTargetUsernameRequired": "اسم المستخدم الهدف مطلوب",
|
|
"unlinkOIDCTitle": "إلغاء ربط مصادقة OIDC",
|
|
"unlinkOIDCDescription": "إزالة مصادقة OIDC من {{username}}؟ المستخدم سيكون قادرا فقط على تسجيل الدخول باستخدام اسم المستخدم/كلمة المرور بعد ذلك.",
|
|
"unlinkOIDCSuccess": "OIDC غير مرتبط بـ {{username}}",
|
|
"failedToUnlinkOIDC": "فشل إلغاء ربط OIDC",
|
|
"databaseSecurity": "أمن قاعدة البيانات",
|
|
"encryptionStatus": "حالة التشفير",
|
|
"encryptionEnabled": "التشفير ممكّن",
|
|
"enabled": "تمكين",
|
|
"disabled": "معطل",
|
|
"keyId": "معرف المفتاح",
|
|
"created": "أنشئ",
|
|
"migrationStatus": "حالة الهجرة",
|
|
"migrationCompleted": "اكتمل الترحيل",
|
|
"migrationRequired": "الهجرة مطلوبة",
|
|
"deviceProtectedMasterKey": "المفتاح الرئيسي المحمي للبيئة",
|
|
"legacyKeyStorage": "تخزين المفتاح القديم",
|
|
"masterKeyEncryptedWithDeviceFingerprint": "مفتاح رئيسي مشفر مع بصمة البيئة (حماية كيك نشطة)",
|
|
"keyNotProtectedByDeviceBinding": "مفتاح غير محمي بربط البيئة (الترقية الموصى بها)",
|
|
"valid": "Valid",
|
|
"initializeDatabaseEncryption": "تهيئة تشفير قاعدة البيانات",
|
|
"enableAes256EncryptionWithDeviceBinding": "تمكين تشفير AES-256 مع حماية المفاتيح الرئيسية المرتبطة بالبيئة. هذا يخلق أمان درجة المؤسسة لمفاتيح SSH وكلمات المرور وتوثيق الرموز.",
|
|
"featuresEnabled": "المميزات مفعلة:",
|
|
"aes256GcmAuthenticatedEncryption": "تشفير AES-256-GCM المصادق عليه",
|
|
"deviceFingerprintMasterKeyProtection": "حماية المفتاح الرئيسي لبصمة البيئة (KEK)",
|
|
"pbkdf2KeyDerivation": "اشتقاق مفتاح PBKDF2 مع تكرارات 100K",
|
|
"automaticKeyManagement": "الإدارة التلقائية للمفاتيح وتناوبها",
|
|
"initializing": "تهيئة...",
|
|
"initializeEnterpriseEncryption": "تهيئة تشفير المؤسسة",
|
|
"migrateExistingData": "ترحيل البيانات الموجودة",
|
|
"encryptExistingUnprotectedData": "قم بتشفير البيانات الموجودة غير المحمية في قاعدة البيانات الخاصة بك. هذه العملية آمنة وتنشئ النسخ الاحتياطي التلقائي.",
|
|
"testMigrationDryRun": "التحقق من توافق التشفير",
|
|
"migrating": "هجرة...",
|
|
"migrateData": "ترحيل البيانات",
|
|
"securityInformation": "المعلومات الأمنية",
|
|
"sshPrivateKeysEncryptedWithAes256": "مفاتيح SSH الخاصة وكلمات المرور مشفرة باستخدام AES-256-GCM",
|
|
"userAuthTokensProtected": "رمز مصادقة المستخدم و أسرار 2FA محمية",
|
|
"masterKeysProtectedByDeviceFingerprint": "مفاتيح التشفير الرئيسية محمية ببصمة الجهاز (KEK)",
|
|
"keysBoundToServerInstance": "المفاتيح مرتبطة ببيئة الخادوم الحالية (يمكن نقلها عبر متغيرات البيئة)",
|
|
"pbkdf2HkdfKeyDerivation": "اشتقاق مفتاح PBKDF2 + HKDF مع تكرارات 100K",
|
|
"backwardCompatibleMigration": "تظل جميع البيانات متوافقة إلى الوراء أثناء الترحيل",
|
|
"enterpriseGradeSecurityActive": "نَشِط أمن درجة المؤسسة",
|
|
"masterKeysProtectedByDeviceBinding": "مفاتيح التشفير الرئيسية الخاصة بك محمية بواسطة بصمات الأصابع البيئية. يستخدم هذا اسم مضيف الخادم، المسارات ومعلومات البيئة الأخرى لتوليد مفاتيح الحماية. لترحيل الخوادم، قم بتعيين متغير بيئة DB_ENCRYPTION_KEY على الخادم الجديد.",
|
|
"important": "مهم",
|
|
"keepEncryptionKeysSecure": "تأكد من أمن البيانات: النسخ الاحتياطي بانتظام لملفات قاعدة البيانات وتكوين الخادم. للانتقال إلى خادم جديد، قم بتعيين متغير بيئة DB_ENCRYPTION_KEY على البيئة الجديدة، أو الحفاظ على نفس اسم المضيف وهيكل الدليل.",
|
|
"loadingEncryptionStatus": "جاري تحميل حالة التشفير...",
|
|
"testMigrationDescription": "التحقق من أن البيانات الموجودة يمكن نقلها بأمان إلى تنسيق مشفر دون تعديل أي بيانات بالفعل",
|
|
"serverMigrationGuide": "دليل هجرة الخادم",
|
|
"migrationInstructions": "لترحيل البيانات المشفرة إلى خادم جديد: 1) نسخ احتياطي لملفات قاعدة البيانات، 2) تعيين متغير البيئة DB_ENCRYPTION_KEY=\"المفتاح الخاص بك\" على خادم جديد، 3) استعادة ملفات قاعدة البيانات",
|
|
"environmentProtection": "حماية البيئة",
|
|
"environmentProtectionDesc": "يحمي مفاتيح التشفير استنادًا إلى معلومات بيئة الخادم (اسم المضيف، المسارات، إلخ.)، قابلة للترحيل عبر متغيرات البيئة",
|
|
"verificationCompleted": "تم التحقق من التوافق - لم يتم تغيير أي بيانات",
|
|
"verificationInProgress": "اكتمل التحقق",
|
|
"dataMigrationCompleted": "اكتمل نقل البيانات بنجاح!",
|
|
"verificationFailed": "فشل التحقق من التوافق",
|
|
"migrationFailed": "فشل الترحيل",
|
|
"runningVerification": "تشغيل التحقق من التوافق...",
|
|
"startingMigration": "بدء الهجرة...",
|
|
"hardwareFingerprintSecurity": "أمان بصمة الجهاز",
|
|
"hardwareBoundEncryption": "تنشيط تشفير Hardware-Bound",
|
|
"masterKeysNowProtectedByHardwareFingerprint": "المفاتيح الرئيسية محمية الآن بواسطة بصمات الأجهزة الحقيقية بدلا من متغيرات البيئة",
|
|
"cpuSerialNumberDetection": "كشف الرقم التسلسلي لوحدة المعالجة المركزية",
|
|
"motherboardUuidIdentification": "تحديد UUID لوحات الأم",
|
|
"diskSerialNumberVerification": "التحقق من الرقم المسلسل للقرص",
|
|
"biosSerialNumberCheck": "التحقق من الرقم التسلسلي لـ BIOS",
|
|
"stableMacAddressFiltering": "تصفية عنوان MAC المستقر",
|
|
"databaseFileEncryption": "تشفير ملف قاعدة البيانات",
|
|
"dualLayerProtection": "حماية مزدوجة الطبقة نشطة",
|
|
"bothFieldAndFileEncryptionActive": "التشفير على المستوى الميداني ومستوى الملفات الآن نشط لأقصى قدر من الأمان",
|
|
"fieldLevelAes256Encryption": "تشفير على مستوى الميدان AES-256 للبيانات الحساسة",
|
|
"fileLevelDatabaseEncryption": "تشفير قاعدة بيانات مستوى الملف مع ربط الأجهزة",
|
|
"hardwareBoundFileKeys": "مفاتيح تشفير الملفات المرتبطة بالهدادي",
|
|
"automaticEncryptedBackups": "إنشاء نسخة احتياطية مشفرة تلقائياً",
|
|
"createEncryptedBackup": "إنشاء نسخة احتياطية مشفرة",
|
|
"creatingBackup": "إنشاء النسخ الاحتياطي...",
|
|
"backupCreated": "تم إنشاء نسخة احتياطية",
|
|
"encryptedBackupCreatedSuccessfully": "تم إنشاء نسخة احتياطية مشفرة بنجاح",
|
|
"backupCreationFailed": "فشل إنشاء النسخ الاحتياطي",
|
|
"databaseMigration": "نقل قاعدة البيانات",
|
|
"exportForMigration": "تصدير من أجل الهجرة",
|
|
"exportDatabaseForHardwareMigration": "تصدير قاعدة البيانات كملف SQLite مع بيانات فك تشفير للترحيل إلى أجهزة جديدة",
|
|
"exportDatabase": "Export SQLite Database",
|
|
"exporting": "تصدير...",
|
|
"exportCreated": "تم إنشاء تصدير SQLite",
|
|
"exportContainsDecryptedData": "تصدير SQLite يحتوي على بيانات غير مشفرة - ابقى آمن!",
|
|
"databaseExportedSuccessfully": "تم تصدير قاعدة بيانات SQLite بنجاح",
|
|
"databaseExportFailed": "فشل تصدير قاعدة البيانات SQLite",
|
|
"importFromMigration": "استيراد من الهجرة",
|
|
"importDatabaseFromAnotherSystem": "استيراد قاعدة بيانات SQLite من نظام آخر أو أجهزة أخرى",
|
|
"importDatabase": "Import SQLite Database",
|
|
"importing": "استيراد...",
|
|
"selectedFile": "ملف SQLite المحدد",
|
|
"importWillReplaceExistingData": "استيراد SQLite سيحل محل البيانات الموجودة - النسخ الاحتياطي الموصى به!",
|
|
"pleaseSelectImportFile": "الرجاء تحديد ملف استيراد SQLite",
|
|
"databaseImportedSuccessfully": "تم استيراد قاعدة بيانات SQLite بنجاح",
|
|
"databaseImportFailed": "فشل استيراد قاعدة البيانات SQLite",
|
|
"manageEncryptionAndBackups": "إدارة مفاتيح التشفير، وأمن قاعدة البيانات، وعمليات النسخ الاحتياطي",
|
|
"activeSecurityFeatures": "التدابير وتدابير الحماية الأمنية الناشطة حاليا",
|
|
"deviceBindingTechnology": "تكنولوجيا الحماية الرئيسية المتقدمة القائمة على المعدات",
|
|
"backupAndRecovery": "إنشاء نسخة احتياطية آمنة وخيارات استعادة قاعدة البيانات",
|
|
"crossSystemDataTransfer": "تصدير واستيراد قواعد بيانات عبر النظم المختلفة",
|
|
"noMigrationNeeded": "لا تحتاج إلى ترحيل",
|
|
"encryptionKey": "مفتاح التشفير",
|
|
"keyProtection": "حماية المفتاح",
|
|
"active": "نشط",
|
|
"legacy": "الإرث",
|
|
"dataStatus": "حالة البيانات",
|
|
"encrypted": "مشفرة",
|
|
"needsMigration": "يحتاج إلى هجرة",
|
|
"ready": "مستعد",
|
|
"initializeEncryption": "تهيئة التشفير",
|
|
"initialize": "تهيئة",
|
|
"test": "اختبار",
|
|
"migrate": "ترحيل",
|
|
"backup": "النسخ الاحتياطي",
|
|
"createBackup": "إنشاء نسخة احتياطية",
|
|
"exportImport": "تصدير/استيراد",
|
|
"export": "تصدير",
|
|
"import": "استيراد",
|
|
"passwordRequired": "كلمة المرور مطلوبة",
|
|
"confirmExport": "تأكيد التصدير",
|
|
"exportDescription": "تصدير مضيفي SSH و بيانات الاعتماد كملف SQLite",
|
|
"importDescription": "استيراد ملف SQLite مع الدمج التصاعدي (تخطي التكرار)",
|
|
"criticalWarning": "تحذير حاسم",
|
|
"cannotDisablePasswordLoginWithoutOIDC": "لا يمكن تعطيل تسجيل الدخول إلى كلمة المرور بدون تكوين OIDC! يجب تكوين مصادقة OIDC قبل تعطيل تسجيل الدخول لكلمة المرور، أو ستفقد الوصول إلى Termix.",
|
|
"confirmDisablePasswordLogin": "هل أنت متأكد من أنك تريد تعطيل تسجيل الدخول لكلمة المرور؟ تأكد من تكوين OIDC بشكل صحيح والعمل قبل المتابعة، أو ستفقد الوصول إلى مثيل Termix الخاص بك.",
|
|
"passwordLoginDisabled": "تم تعطيل تسجيل الدخول لكلمة المرور بنجاح",
|
|
"passwordLoginAndRegistrationDisabled": "تسجيل الدخول لكلمة المرور وتسجيل الحساب الجديد معطل بنجاح",
|
|
"requiresPasswordLogin": "يتطلب تسجيل الدخول لكلمة المرور مفعل",
|
|
"passwordLoginDisabledWarning": "تسجيل الدخول لكلمة المرور معطل. تأكد من تكوين OIDC بشكل صحيح أو لن تتمكن من تسجيل الدخول إلى Termix.",
|
|
"oidcRequiredWarning": "إنشاء: تم تعطيل تسجيل الدخول لكلمة المرور. إذا قمت بإعادة تعيين OIDC أو إساءة إعداده، فستفقد جميع الصلاحيات إلى Termix وستلغي مثالك. المضي قدما فقط إذا كنت متأكدا تماما.",
|
|
"confirmDisableOIDCWarning": "تحذير: أنت على وشك تعطيل OIDC بينما يتم تعطيل تسجيل الدخول لكلمة المرور أيضا. سيؤدي هذا إلى طوب مثيل الـ Termix الخاص بك وسوف تفقد كل الوصول. هل أنت متأكد تماما من أنك تريد المتابعة؟",
|
|
"failedToUpdatePasswordLoginStatus": "فشل تحديث حالة تسجيل الدخول لكلمة المرور",
|
|
"loadingSessions": "جاري تحميل الجلسات...",
|
|
"noActiveSessions": "لم يتم العثور على جلسات نشطة.",
|
|
"device": "الجهاز",
|
|
"user": "المستخدم",
|
|
"lastActive": "آخر نشاط",
|
|
"expires": "تنتهي",
|
|
"revoked": "Revoked",
|
|
"revokeAllUserSessionsTitle": "إلغاء جميع الجلسات لهذا المستخدم",
|
|
"revokeAll": "إلغاء الكل",
|
|
"linkOidcToPasswordAccount": "ربط حساب OIDC بحساب كلمة المرور",
|
|
"linkOidcToPasswordAccountDescription": "ربط {{username}} مستخدم (OIDC) بحساب كلمة المرور الموجود. وهذا سيمكن المصادقة المزدوجة لحساب كلمة المرور.",
|
|
"linkOidcWarningTitle": "تحذير: سيتم حذف بيانات المستخدم OIDC",
|
|
"linkOidcWarningDescription": "وسيقوم هذا الإجراء بما يلي:",
|
|
"linkOidcActionDeleteUser": "حذف حساب مستخدم OIDC وجميع بياناتهم",
|
|
"linkOidcActionAddCapability": "إضافة قدرة تسجيل الدخول OIDC إلى حساب كلمة المرور المستهدفة",
|
|
"linkOidcActionDualAuth": "السماح لحساب كلمة المرور بتسجيل الدخول باستخدام كل من كلمة المرور و OIDC",
|
|
"passwordMinLength": "يجب أن تتكون كلمة المرور من 6 أحرف على الأقل",
|
|
"currentRoles": "الأدوار الحالية",
|
|
"noRolesAssigned": "لا توجد أدوار مسندة",
|
|
"assignNewRole": "تعيين دور جديد"
|
|
},
|
|
"hosts": {
|
|
"title": "مدير المضيف",
|
|
"sshHosts": "مضيفي SSH",
|
|
"noHosts": "لا يوجد مضيفين SSH",
|
|
"noHostsMessage": "لم تقم بإضافة أي مضيف SSH حتى الآن. انقر فوق \"إضافة مضيف\" للبدء.",
|
|
"loadingHosts": "جاري تحميل المضيفين...",
|
|
"failedToLoadHosts": "فشل تحميل المضيفين",
|
|
"retry": "إعادة المحاولة",
|
|
"refresh": "تحديث",
|
|
"optional": "اختياري",
|
|
"hostsCount": "{{count}} المضيفون",
|
|
"importJson": "استيراد JSON",
|
|
"importing": "استيراد...",
|
|
"importJsonTitle": "استيراد مضيف SSH من JSON",
|
|
"importJsonDesc": "تحميل ملف JSON لاستيراد مستضيفات SSH متعددة (الحد الأقصى 100).",
|
|
"downloadSample": "تحميل عينة",
|
|
"formatGuide": "دليل التنسيق",
|
|
"exportCredentialWarning": "تحذير: المضيف \"{{name}}\" يستخدم مصادقة الاعتماد. الملف الذي تم تصديره لن يتضمن بيانات الاعتماد وسوف تحتاج إلى إعادة تكوين يدوياً بعد الاستيراد. هل تريد الاستمرار؟",
|
|
"exportSensitiveDataWarning": "تحذير: المضيف \"{{name}}\" يحتوي على بيانات مصادقة حساسة (كلمة المرور/مفتاح SH). سيتضمن الملف الذي تم تصديره هذه البيانات في plaintext. الرجاء الحفاظ على الملف آمن وحذفه بعد الاستخدام. هل تريد المتابعة؟",
|
|
"uncategorized": "غير مصنف",
|
|
"confirmDelete": "هل أنت متأكد من أنك تريد حذف \"{{name}}\" ؟",
|
|
"failedToDeleteHost": "فشل في حذف المضيف",
|
|
"failedToExportHost": "فشل في تصدير المضيف. الرجاء التأكد من تسجيل الدخول والوصول إلى بيانات المضيف.",
|
|
"jsonMustContainHosts": "JSON يجب أن يحتوي على مصفوفة \"المضيفين\" أو أن يكون مصفوفة من المضيفين",
|
|
"noHostsInJson": "لم يتم العثور على مضيف في ملف JSON",
|
|
"maxHostsAllowed": "الحد الأقصى المسموح به 100 مضيف لكل استيراد",
|
|
"importCompleted": "اكتمل الاستيراد: {{success}} ناجح, {{failed}} فشل",
|
|
"importFailed": "فشل الاستيراد",
|
|
"importError": "خطأ في الاستيراد",
|
|
"failedToImportJson": "فشل استيراد ملف JSON",
|
|
"connectionDetails": "تفاصيل الاتصال",
|
|
"organization": "المنظمة",
|
|
"ipAddress": "عنوان IP",
|
|
"port": "المنفذ",
|
|
"name": "الاسم",
|
|
"username": "اسم المستخدم",
|
|
"folder": "مجلد",
|
|
"tags": "الوسوم",
|
|
"pin": "تثبيت",
|
|
"notes": "الحواشي",
|
|
"expirationDate": "تاريخ انتهاء الصلاحية",
|
|
"passwordRequired": "كلمة المرور مطلوبة عند استخدام مصادقة كلمة المرور",
|
|
"sshKeyRequired": "مفتاح SSH الخاص مطلوب عند استخدام مصادقة المفتاح",
|
|
"keyTypeRequired": "نوع المفتاح مطلوب عند استخدام مصادقة المفتاح",
|
|
"mustSelectValidSshConfig": "يجب تحديد تكوين SSH صالح من القائمة",
|
|
"addHost": "إضافة مضيف",
|
|
"editHost": "تحرير المضيف",
|
|
"cloneHost": "استنساخ المضيف",
|
|
"updateHost": "تحديث المضيف",
|
|
"hostUpdatedSuccessfully": "المضيف \"{{name}}تم تحديثه بنجاح!",
|
|
"hostAddedSuccessfully": "استضيف \"{{name}}\" تمت إضافته بنجاح!",
|
|
"hostDeletedSuccessfully": "استضيف \"{{name}}\" حذف بنجاح!",
|
|
"failedToSaveHost": "فشل في حفظ المضيف. الرجاء المحاولة مرة أخرى.",
|
|
"savingHost": "حفظ المضيف...",
|
|
"updatingHost": "تحديث المضيف...",
|
|
"cloningHost": "استنساخ المضيف...",
|
|
"enableTerminal": "تمكين المحطة الطرفية",
|
|
"enableTerminalDesc": "تمكين/تعطيل رؤية المضيف في علامة التبويب الطرفية",
|
|
"enableTunnel": "تمكين النفق",
|
|
"enableTunnelDesc": "تمكين/تعطيل رؤية المضيف في تبويب النفق",
|
|
"enableFileManager": "تمكين مدير الملفات",
|
|
"enableFileManagerDesc": "تمكين/تعطيل رؤية المضيف في علامة تبويب مدير الملفات",
|
|
"enableDockerDesc": "تمكين/تعطيل رؤية المضيف في علامة التبويب Docker",
|
|
"enableDocker": "تمكين Docker",
|
|
"defaultPath": "المسار الافتراضي",
|
|
"defaultPathDesc": "الدليل الافتراضي عند فتح مدير الملفات لهذا المضيف",
|
|
"tunnelConnections": "اتصالات النفق",
|
|
"connection": "اتصال",
|
|
"remove": "إزالة",
|
|
"sourcePort": "منفذ المصدر",
|
|
"sourcePortDesc": " (المصدر يشير إلى تفاصيل الاتصال الحالية في علامة التبويب العام)",
|
|
"endpointPort": "منفذ نقطة النهاية",
|
|
"endpointSshConfig": "تكوين SSH نقطة النهاية",
|
|
"tunnelForwardDescription": "سيؤدي هذا النفق إلى نقل حركة المرور من المنفذ {{sourcePort}} على جهاز المصدر (تفاصيل الاتصال الحالي في التبويب العام) إلى المنفذ {{endpointPort}} على جهاز نقطة النهاية.",
|
|
"maxRetries": "الحد الاقصى لمحاولات",
|
|
"maxRetriesDescription": "الحد الأقصى لعدد محاولات إعادة المحاولة للاتصال بالأنفاق.",
|
|
"retryInterval": "الفاصل الزمني لإعادة المحاولة (بالثواني)",
|
|
"retryIntervalDescription": "حان وقت الانتظار بين محاولات إعادة المحاولة.",
|
|
"autoStartContainer": "بدء التشغيل التلقائي عند تشغيل الحاوية",
|
|
"autoStartDesc": "تشغيل هذا النفق تلقائياً عند تشغيل الحاوية",
|
|
"addConnection": "إضافة اتصال نفق",
|
|
"tunnelType": "نوع النفق",
|
|
"tunnelTypeLocal": "محلي (-L)",
|
|
"tunnelTypeRemote": "عن بعد (-R)",
|
|
"tunnelTypeLocalDesc": "إعادة توجيه المنفذ المحلي إلى نقطة النهاية البعيدة",
|
|
"tunnelTypeRemoteDesc": "إعادة توجيه المنفذ البعيد إلى الجهاز المحلي",
|
|
"tunnelForwardDescriptionLocal": "سيؤدي هذا النفق إلى نقل الحركة من المنفذ المحلي {{sourcePort}} إلى المنفذ {{endpointPort}} على آلة نقطة النهاية.",
|
|
"tunnelForwardDescriptionRemote": "سيؤدي هذا النفق إلى نقل حركة المرور من المنفذ {{sourcePort}} على جهاز المصدر (تفاصيل الاتصال الحالي في التبويب العام) إلى المنفذ {{endpointPort}} على جهاز نقطة النهاية.",
|
|
"sshpassRequired": "تجاوز مطلوب للمصادقة على كلمة المرور",
|
|
"sshpassRequiredDesc": "للمصادقة بكلمة المرور في الأنفاق، يجب تثبيت Sshpassعلى النظام.",
|
|
"otherInstallMethods": "طرق تثبيت أخرى:",
|
|
"debianUbuntuEquivalent": "(Debian/Ubuntu) أو ما يعادلها من نظام التشغيل الخاص بك.",
|
|
"or": "أو",
|
|
"centosRhelFedora": "CentOS/RHEL/Fedora",
|
|
"macos": "macOS",
|
|
"windows": "ويندوز (WSL، لا يوجد ثنائي رسمي)",
|
|
"sshServerConfigRequired": "إعدادات خادم SSH مطلوبة",
|
|
"sshServerConfigDesc": "بالنسبة لاتصالات الأنفاق، يجب تكوين خادم SSH للسماح بإعادة توجيه المنفذ:",
|
|
"gatewayPortsYes": "لربط المنافذ البعيدة بجميع الواجهات",
|
|
"allowTcpForwardingYes": "لتمكين إعادة توجيه المنفذ",
|
|
"permitRootLoginYes": "إذا استخدم المستخدم الجذر للتنقل",
|
|
"editSshConfig": "تحرير ملف تهيئة SSH:",
|
|
"sshConfigPath": "/etc/ssh/sshd_config",
|
|
"restartSshService": "ثم أعد تشغيل خدمة SSH:",
|
|
"restartSshCommand": "sudo systemctl إعادة تشغيل sshd",
|
|
"upload": "تحميل",
|
|
"authentication": "المصادقة",
|
|
"password": "كلمة المرور",
|
|
"key": "المفتاح",
|
|
"credential": "بيانات",
|
|
"none": "لا",
|
|
"selectCredential": "حدد بيانات الاعتماد",
|
|
"selectCredentialPlaceholder": "اختر بيانات الاعتماد...",
|
|
"credentialRequired": "الاعتماد مطلوب عند استخدام مصادقة الاعتماد",
|
|
"credentialDescription": "تحديد بيانات الاعتماد سيؤدي إلى الكتابة فوق اسم المستخدم الحالي واستخدام تفاصيل مصادقة بيانات الاعتماد.",
|
|
"cannotChangeAuthAsSharedUser": "لا يمكن تغيير المصادقة كمستخدم مشترك",
|
|
"sshPrivateKey": "مفتاح SSH الخاص",
|
|
"keyPassword": "كلمة المرور الرئيسية",
|
|
"keyType": "نوع المفتاح",
|
|
"autoDetect": "الكشف التلقائي",
|
|
"rsa": "RSA",
|
|
"ed25519": "ED25519",
|
|
"ecdsaNistP256": "الجدول ألف - 6",
|
|
"ecdsaNistP384": "الجدول ألف - 4",
|
|
"ecdsaNistP521": "ECDSA NIST P-521",
|
|
"dsa": "DSA",
|
|
"rsaSha2256": "RSA SHA2-256",
|
|
"rsaSha2512": "RSA SHA2-512",
|
|
"uploadFile": "تحميل ملف",
|
|
"pasteKey": "لصق المفتاح",
|
|
"updateKey": "تحديث المفتاح",
|
|
"existingKey": "المفتاح الحالي (انقر للتغيير)",
|
|
"existingCredential": "بيانات الاعتماد الحالية (انقر للتغيير)",
|
|
"addTagsSpaceToAdd": "إضافة وسوم (مساحة لإضافة)",
|
|
"terminalBadge": "المحطة",
|
|
"tunnelBadge": "نفق",
|
|
"fileManagerBadge": "مدير الملفات",
|
|
"general": "عام",
|
|
"terminal": "المحطة",
|
|
"tunnel": "نفق",
|
|
"fileManager": "مدير الملفات",
|
|
"serverStats": "إحصائيات الخادم",
|
|
"hostViewer": "عارض المضيف",
|
|
"enableServerStats": "تمكين إحصائيات الخادم",
|
|
"enableServerStatsDesc": "تمكين/تعطيل مجموعة إحصائيات الخادم لهذا المضيف",
|
|
"displayItems": "عرض العناصر",
|
|
"displayItemsDesc": "اختر المقاييس التي سيتم عرضها في صفحة إحصائيات الخادم",
|
|
"enableCpu": "استخدام المعالج",
|
|
"enableMemory": "استخدام الذاكرة",
|
|
"enableDisk": "استخدام القرص",
|
|
"enableNetwork": "إحصاءات الشبكة (قريبا)",
|
|
"enableProcesses": "عدد العمليات (قريبا)",
|
|
"enableUptime": "وقت التحديث (قريبا)",
|
|
"enableHostname": "اسم المضيف (قريبا)",
|
|
"enableOs": "نظام التشغيل (قريبا)",
|
|
"customCommands": "أوامر مخصصة (قريبا)",
|
|
"customCommandsDesc": "تحديد أوامر إيقاف التشغيل وإعادة التشغيل المخصصة لهذا الخادم",
|
|
"shutdownCommand": "إيقاف تشغيل الأمر",
|
|
"rebootCommand": "أمر إعادة التشغيل",
|
|
"confirmRemoveFromFolder": "هل أنت متأكد من أنك تريد إزالة \"{{name}}\" من المجلد \"{{folder}}\"؟ المضيف سيتم نقله إلى \"لا مجلد\".",
|
|
"removedFromFolder": "المضيف \"{{name}}تمت إزالته من المجلد بنجاح",
|
|
"failedToRemoveFromFolder": "فشل إزالة المضيف من المجلد",
|
|
"folderRenamed": "المجلد \"{{oldName}}\" أعيدت تسميته إلى \"{{newName}}\" بنجاح",
|
|
"failedToRenameFolder": "فشل في إعادة تسمية المجلد",
|
|
"editFolderAppearance": "تحرير مظهر المجلد",
|
|
"editFolderAppearanceDesc": "تخصيص اللون والأيقونة للمجلد",
|
|
"folderColor": "لون المجلد",
|
|
"folderIcon": "أيقونة المجلد",
|
|
"preview": "معاينة",
|
|
"folderAppearanceUpdated": "تم تحديث مظهر المجلد بنجاح",
|
|
"failedToUpdateFolderAppearance": "فشل تحديث مظهر المجلد",
|
|
"deleteAllHostsInFolder": "حذف جميع المضيفين في المجلد",
|
|
"confirmDeleteAllHostsInFolder": "هل أنت متأكد من أنك تريد حذف جميع المضيفين {{count}} في المجلد \"{{folder}}\"؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"allHostsInFolderDeleted": "تم حذف مضيفين {{count}} من المجلد \"{{folder}}\" بنجاح",
|
|
"failedToDeleteHostsInFolder": "فشل في حذف المضيفين في المجلد",
|
|
"movedToFolder": "المضيف \"{{name}}\" انتقل إلى \"{{folder}}\" بنجاح",
|
|
"failedToMoveToFolder": "فشل نقل المضيف إلى المجلد",
|
|
"clickToRenameFolder": "انقر لإعادة تسمية المجلد",
|
|
"renameFolder": "إعادة تسمية المجلد",
|
|
"removeFromFolder": "إزالة من المجلد \"{{folder}}\"",
|
|
"editHostTooltip": "تحرير المضيف",
|
|
"deleteHostTooltip": "حذف المضيف",
|
|
"exportHostTooltip": "تصدير المضيف",
|
|
"cloneHostTooltip": "استنساخ المضيف",
|
|
"clickToEditHost": "انقر لتعديل المضيف",
|
|
"dragToMoveBetweenFolders": "اسحب للانتقال بين المجلدات",
|
|
"exportedHostConfig": "تصدير إعدادات المضيف ل {{name}}",
|
|
"openTerminal": "فتح محطة طرفية",
|
|
"openFileManager": "فتح مدير الملفات",
|
|
"openTunnels": "فتح الأنفاق",
|
|
"openServerDetails": "فتح تفاصيل الخادم",
|
|
"statistics": "الإحصائيات",
|
|
"enabledWidgets": "تمكين الودجت",
|
|
"openServerStats": "فتح إحصائيات الخادم",
|
|
"enabledWidgetsDesc": "حدد الاحصائيات التي سيتم عرضها لهذا المضيف",
|
|
"monitoringConfiguration": "إعدادات الرصد",
|
|
"monitoringConfigurationDesc": "تكوين عدد المرات التي يتم فيها التحقق من إحصائيات السيرفر والحالة",
|
|
"statusCheckEnabled": "تمكين مراقبة الحالة",
|
|
"statusCheckEnabledDesc": "تحقق مما إذا كان الخادم متصلاً أو غير متصل",
|
|
"statusCheckInterval": "فترة التحقق من الحالة",
|
|
"statusCheckIntervalDesc": "كم عدد المرات للتحقق مما إذا كان المضيف متصل بالإنترنت (5s - 1ساعة)",
|
|
"metricsEnabled": "تمكين مراقبة القياسات",
|
|
"metricsEnabledDesc": "جمع إحصائيات المعالجة، ذاكرة الوصول العشوائي، القرص وغيرها من إحصائيات النظام",
|
|
"metricsInterval": "الفاصل الزمني لمجموعة القياسات",
|
|
"metricsIntervalDesc": "كم عدد المرات لجمع إحصائيات الخادم (5s - 1ساعة)",
|
|
"intervalSeconds": "ثواني",
|
|
"intervalMinutes": "دقائق",
|
|
"intervalValidation": "يجب أن تكون فترات الرصد بين 5 ثوان وساعة واحدة (3600 ثانية)",
|
|
"monitoringDisabled": "تم تعطيل مراقبة السيرفر لهذا المضيف",
|
|
"enableMonitoring": "تمكين المراقبة في مدير المضيف → علامة تبويب الإحصاءات",
|
|
"monitoringDisabledBadge": "إيقاف الرصد",
|
|
"statusMonitoring": "الحالة",
|
|
"metricsMonitoring": "القياسات",
|
|
"terminalCustomization": "تخصيص المحطة الطرفية",
|
|
"appearance": "المظهر",
|
|
"behavior": "السلوك",
|
|
"advanced": "متقدم",
|
|
"themePreview": "معاينة السمة",
|
|
"theme": "السمة",
|
|
"selectTheme": "حدد السمة",
|
|
"chooseColorTheme": "اختر سمة لون للمحطة الطرفية",
|
|
"fontFamily": "عائلة الخط",
|
|
"selectFont": "Select font",
|
|
"selectFontDesc": "حدد الخط لاستخدامه في المحطة الطرفية",
|
|
"fontSize": "Font Size",
|
|
"fontSizeValue": "حجم الخط: {{value}}px",
|
|
"adjustFontSize": "ضبط حجم الخط الطرفي",
|
|
"letterSpacing": "تباعد الحروف",
|
|
"letterSpacingValue": "تباعد الحرف: {{value}}px",
|
|
"adjustLetterSpacing": "ضبط المسافة بين الأحرف",
|
|
"lineHeight": "ارتفاع الخط",
|
|
"lineHeightValue": "ارتفاع الخط: {{value}}",
|
|
"adjustLineHeight": "ضبط المسافة بين الأسطر",
|
|
"cursorStyle": "نمط المؤشر",
|
|
"selectCursorStyle": "حدد نمط المؤشر",
|
|
"cursorStyleBlock": "كتلة",
|
|
"cursorStyleUnderline": "أسفل",
|
|
"cursorStyleBar": "شريط",
|
|
"chooseCursorAppearance": "اختر مظهر المؤشر",
|
|
"cursorBlink": "وميض المؤشر",
|
|
"enableCursorBlink": "تمكين المؤشّر الضبابي المتحرك",
|
|
"scrollbackBuffer": "المخزن المؤقت للتمرير",
|
|
"scrollbackBufferValue": "مخزن التمرير: {{value}} أسطر",
|
|
"scrollbackBufferDesc": "عدد الأسطر التي يجب الاحتفاظ بها في سجل التمرير",
|
|
"bellStyle": "نمط الجرس",
|
|
"selectBellStyle": "حدد نمط الجرس",
|
|
"bellStyleNone": "لا",
|
|
"bellStyleSound": "صوت",
|
|
"bellStyleVisual": "مرئي",
|
|
"bellStyleBoth": "كلاهما",
|
|
"bellStyleDesc": "كيفية التعامل مع الجرس الطرفي (رمز BEL ، \\x07). البرامج تشغل هذا عند إكمال المهام، مواجهة الأخطاء، أو للإخطارات. \"الصوت\" يشغل باقة صوتية، و \"مرئية\" تشعل الشاشة بإيجاز، و \"كليهما\" يفعل كلاهما، و \"لا شيء\" يعطل تنبيهات الجذر.",
|
|
"rightClickSelectsWord": "النقر الأيمن يحدد الكلمة",
|
|
"rightClickSelectsWordDesc": "النقر على اليمين يحدد الكلمة تحت المؤشر",
|
|
"fastScrollModifier": "تعديل التمرير السريع",
|
|
"selectModifier": "حدد معدلا",
|
|
"modifierAlt": "Alt",
|
|
"modifierCtrl": "Ctrl",
|
|
"modifierShift": "تبديل",
|
|
"fastScrollModifierDesc": "مفتاح التعديل للتمرير السريع",
|
|
"fastScrollSensitivity": "حساسية التمرير السريع",
|
|
"fastScrollSensitivityValue": "حساسية التمرير السريع: {{value}}",
|
|
"fastScrollSensitivityDesc": "مضاعف السرعة التمرير عند تشغيل المعدِّل",
|
|
"minimumContrastRatio": "الحد الأدنى لمعدل التباين",
|
|
"minimumContrastRatioValue": "الحد الأدنى لمعدل التباين: {{value}}",
|
|
"minimumContrastRatioDesc": "ضبط الألوان تلقائياً لتحسين القراءة",
|
|
"sshAgentForwarding": "إعادة توجيه وكيل SSH",
|
|
"sshAgentForwardingDesc": "إعادة توجيه وكيل مصادقة SSH إلى المضيف البعيد",
|
|
"backspaceMode": "وضع الفضاء الخلفي",
|
|
"selectBackspaceMode": "حدد وضع الفضاء الخلفي",
|
|
"backspaceModeNormal": "عادي (DEL)",
|
|
"backspaceModeControlH": "التحكم-حاء (^ حاء)",
|
|
"backspaceModeDesc": "سلوك مفتاح ساحة الخلفية للتوافق",
|
|
"startupSnippet": "بدء تشغيل كتلة الكود",
|
|
"selectSnippet": "حدد كتلة الكود",
|
|
"searchSnippets": "البحث عن كتل الكود...",
|
|
"snippetNone": "لا",
|
|
"noneAuthTitle": "المصادقة التفاعلية على لوحة المفاتيح",
|
|
"noneAuthDescription": "طريقة المصادقة هذه ستستخدم مصادقة لوحة المفاتيح التفاعلية عند الاتصال بخادم SSH.",
|
|
"noneAuthDetails": "المصادقة التفاعلية بلوحة المفاتيح تسمح للخادم بمطالبتك للحصول على بيانات الاعتماد أثناء الاتصال. هذا مفيد للخوادم التي تتطلب مصادقة متعددة العناصر أو إذا كنت لا تريد حفظ بيانات الاعتماد محلياً.",
|
|
"forceKeyboardInteractive": "تفعيل لوحة المفاتيح",
|
|
"forceKeyboardInteractiveDesc": "يفرض استخدام مصادقة لوحة المفاتيح التفاعلية. هذا مطلوب أحيانا للخوادم التي تستخدم المصادقة الثنائية (TOTP/2FA).",
|
|
"overrideCredentialUsername": "تجاوز اسم المستخدم",
|
|
"overrideCredentialUsernameDesc": "استخدم اسم مستخدم مختلف عن اسم المستخدم المخزن في بيانات الاعتماد. هذا يسمح لك باستخدام نفس بيانات الاعتماد مع أسماء مستخدمين مختلفة.",
|
|
"jumpHosts": "مضيفي القفز",
|
|
"jumpHostsDescription": "يسمح لك مضيف القفز (المعروف أيضًا باسم مضيفي القفل) بالاتصال بخادم مستهدف من خلال خادم وسيط واحد أو أكثر. هذا مفيد للوصول إلى الخوادم خلف جدران الحماية أو في شبكات خاصة.",
|
|
"jumpHostChain": "اقفز سلسلة المضيف",
|
|
"addJumpHost": "إضافة مضيف قفز",
|
|
"selectServer": "حدد الخادم",
|
|
"searchServers": "البحث في الخوادم...",
|
|
"noServerFound": "لا يوجد خادم",
|
|
"jumpHostsOrder": "سيتم إجراء الاتصالات بالترتيب: قفز المضيف 1 → قفز المضيف 2 → ... → هدف الخادم",
|
|
"socks5Proxy": "وكيل SOCKS5",
|
|
"socks5Description": "تكوين وكيل SOCKS5 للاتصال SSH. سيتم توجيه جميع حركة المرور من خلال خادم الوكيل المحدد.",
|
|
"enableSocks5": "تمكين وكيل SOCKS5",
|
|
"enableSocks5Description": "استخدم وكيل SOCKS5 لهذا الاتصال SSH",
|
|
"socks5Host": "مضيف الوكيل",
|
|
"socks5Port": "منفذ الوكيل",
|
|
"socks5Username": "اسم مستخدم البروكسي",
|
|
"socks5Password": "كلمة مرور الوكيل",
|
|
"socks5UsernameOptional": "اختياري: اتركه فارغاً إذا لم يتطلب البروكسي المصادقة",
|
|
"socks5PasswordOptional": "اختياري: اتركه فارغاً إذا لم يتطلب البروكسي المصادقة",
|
|
"socks5ProxyChain": "سلسلة البروكسي",
|
|
"socks5ProxyChainDescription": "تكوين سلسلة من وكلاء SOCKS. كل وكيل في السلسلة سيتصل عبر السلسلة السابقة.",
|
|
"socks5ProxyMode": "وضع البروكسي",
|
|
"socks5UseSingleProxy": "استخدام وكيل واحد",
|
|
"socks5UseProxyChain": "استخدام سلسلة البروكسي",
|
|
"socks5UsePreset": "استخدام الإعداد المسبق المحفوظ",
|
|
"socks5SelectPreset": "حدد الإعداد المسبق",
|
|
"socks5ManagePresets": "إدارة الإعدادات المسبقة",
|
|
"socks5ProxyNode": "الوكيل {{number}}",
|
|
"socks5AddProxy": "إضافة وكيل إلى السلسلة",
|
|
"socks5RemoveProxy": "إزالة الوكيل",
|
|
"socks5ProxyType": "نوع الوكيل",
|
|
"socks5SaveAsPreset": "حفظ كإعداد مسبق",
|
|
"socks5SavePresetTitle": "حفظ سلسلة البروكسي كتعيين مسبق",
|
|
"socks5SavePresetDescription": "حفظ تكوين سلسلة الوكيل الحالي كتعيين مسبق قابل لإعادة الاستخدام",
|
|
"socks5PresetName": "اسم الإعداد المسبق",
|
|
"socks5PresetDescription": "الوصف (اختياري)",
|
|
"socks5PresetCreated": "تم إنشاء سلسلة البروكسي مسبقاً",
|
|
"socks5PresetUpdated": "تم تحديث الإعداد المسبق لسلسلة الوكيل",
|
|
"socks5PresetDeleted": "تم حذف الإعداد المسبق لسلسلة الوكيل",
|
|
"socks5PresetSaved": "الإعداد المسبق \"{{name}}\" حفظ بنجاح",
|
|
"socks5PresetSaveError": "فشل في حفظ الإعداد المسبق",
|
|
"socks5PresetNameRequired": "اسم الإعداد المسبق مطلوب",
|
|
"socks5EmptyChainError": "لا يمكن حفظ سلسلة وكيل فارغة",
|
|
"socks5ProxyChainEmpty": "إضافة وكيل واحد على الأقل إلى السلسلة",
|
|
"socks5HostDescription": "اسم المضيف أو عنوان IP لخادم وكيل SOCKS",
|
|
"socks5PortDescription": "رقم المنفذ من سيرفر وكيل SOCKS (الافتراضي: 1080)",
|
|
"addProxyNode": "إضافة عقدة الوكيل",
|
|
"noProxyNodes": "لا توجد عُقد بروكسي تم تكوينها. انقر فوق 'إضافة عُقدة بروكسي' لإضافة عُقَدة واحدة.",
|
|
"proxyNode": "عقدة الوكيل",
|
|
"proxyType": "نوع الوكيل",
|
|
"quickActions": "الإجراءات السريعة",
|
|
"quickActionsDescription": "تسمح لك الإجراءات السريعة بإنشاء أزرار مخصصة لتنفيذ كتل SSH على هذا الخادم. ستظهر هذه الأزرار في الجزء العلوي من صفحة إحصائيات الخادم للوصول السريع.",
|
|
"quickActionsList": "قائمة الإجراءات السريعة",
|
|
"addQuickAction": "إضافة إجراء سريع",
|
|
"quickActionName": "اسم الإجراء",
|
|
"noSnippetFound": "لم يتم العثور على كتلة",
|
|
"quickActionsOrder": "ستظهر أزرار الإجراء السريع في الترتيب الوارد أعلاه في صفحة إحصائيات الخادم",
|
|
"sidebarCustomization": "تخصيص زر الشريط الجانبي",
|
|
"sidebarCustomizationDesc": "اختر الإجراءات التي تظهر كأزرار سريعة في الشريط الجانبي. الإجراءات التي لا تظهر كأزرار ستظهر في القائمة المنسدلة.",
|
|
"showTerminalInSidebar": "إظهار زر المحطة الطرفية",
|
|
"showTerminalInSidebarDesc": "عرض المحطة الطرفية كزر سريع في الشريط الجانبي",
|
|
"showFileManagerInSidebar": "إظهار زر مدير الملفات",
|
|
"showFileManagerInSidebarDesc": "عرض مدير الملفات كزر سريع في الشريط الجانبي",
|
|
"showTunnelInSidebar": "إظهار زر النفق",
|
|
"showTunnelInSidebarDesc": "عرض إدارة النفق كزر سريع في الشريط الجانبي",
|
|
"showDockerInSidebar": "إظهار زر الجهاز",
|
|
"showDockerInSidebarDesc": "عرض إدارة المرفأ كزر سريع في الشريط الجانبي",
|
|
"showServerStatsInSidebar": "إظهار زر إحصائيات الخادم",
|
|
"showServerStatsInSidebarDesc": "عرض إحصائيات الخادم كزر سريع في الشريط الجانبي",
|
|
"atLeastOneActionRequired": "يجب عرض إجراء واحد على الأقل مفعل في الشريط الجانبي",
|
|
"advancedAuthSettings": "إعدادات المصادقة المتقدمة",
|
|
"sudoPasswordAutoFill": "كلمة مرور سودو تلقائية",
|
|
"sudoPasswordAutoFillDesc": "عرض تلقائي لإدراج كلمة مرور SSH عندما يطلب sudo لكلمة المرور",
|
|
"sudoPassword": "كلمة مرور سودو",
|
|
"sudoPasswordDesc": "كلمة المرور الاختيارية لأوامر sudo (مفيدة مع مصادقة المفتاح)",
|
|
"socks4": "SOCKS4",
|
|
"socks5": "SOCKS5",
|
|
"executeSnippetOnConnect": "تنفيذ كتلة الكود عندما تتصل المحطة الطرفية",
|
|
"autoMosh": "وضع تلقائي",
|
|
"autoMoshDesc": "تشغيل أمر MOSH تلقائياً عند الاتصال",
|
|
"moshCommand": "قيادة MOSH",
|
|
"moshCommandDesc": "أمر MOSH لتنفيذ",
|
|
"environmentVariables": "المتغيرات البيئية",
|
|
"environmentVariablesDesc": "تعيين متغيرات البيئة المخصصة للجلسة النهائية",
|
|
"variableName": "اسم المتغير",
|
|
"variableValue": "القيمة",
|
|
"addVariable": "إضافة متغير",
|
|
"docker": "دوكر",
|
|
"openDocker": "فتح Docker",
|
|
"copyFullScreenUrl": "نسخ عنوان URL للشاشة الكاملة",
|
|
"fullScreenUrlCopied": "تم نسخ عنوان URL للشاشة الكاملة إلى الحافظة",
|
|
"failedToCopyUrl": "فشل نسخ عنوان URL إلى الحافظة",
|
|
"copyTerminalUrl": "نسخ رابط المحطة",
|
|
"copyFileManagerUrl": "نسخ رابط مدير الملفات",
|
|
"copyTunnelUrl": "نسخ رابط النفق",
|
|
"copyServerStatsUrl": "نسخ رابط إحصائيات الخادم",
|
|
"copyDockerUrl": "نسخ رابط Docker",
|
|
"fullScreenUrlTooltip": "نسخ عنوان URL لفتح هذا التطبيق في وضع ملء الشاشة",
|
|
"notEnabled": "Docker غير مفعل لهذا المضيف. قم بتمكينه في إعدادات المضيف لاستخدام ميزات Docker.",
|
|
"validating": "التحقق من دوكر...",
|
|
"error": "خطأ",
|
|
"errorCode": "رمز الخطأ: {{code}}",
|
|
"version": "دوكر ضد{{version}}",
|
|
"current": "الحالي",
|
|
"used_limit": "مستخدم / حد",
|
|
"percentage": "النسبة المئوية",
|
|
"input": "Input",
|
|
"output": "الناتج",
|
|
"read": "قراءة",
|
|
"write": "كتابة",
|
|
"pids": "أرقام التعريف",
|
|
"id": "ID",
|
|
"state": "الولاية",
|
|
"console": "وحدة",
|
|
"containerMustBeRunning": "يجب أن يكون الحاوية قيد التشغيل للاتصال بوحدة التحكم",
|
|
"authenticationRequired": "مطلوب المصادقة",
|
|
"connectedTo": "متصل بـ {{containerName}}",
|
|
"disconnected": "قطع",
|
|
"consoleError": "خطأ في وحدة التحكم",
|
|
"errorMessage": "خطأ: {{message}}",
|
|
"failedToConnect": "فشل الاتصال بوحدة التحكم",
|
|
"disconnectedFromContainer": "قطع الاتصال بوحدة تحكم الحاوية.",
|
|
"containerNotRunning": "الحاوية غير قيد التشغيل",
|
|
"startContainerToAccess": "بدء تشغيل الحاوية للوصول إلى وحدة التحكم",
|
|
"selectShell": "حدد قذيفة",
|
|
"bash": "باش",
|
|
"sh": "شه",
|
|
"ash": "رماد",
|
|
"connecting": "جاري الاتصال...",
|
|
"connect": "الاتصال",
|
|
"disconnect": "قطع الاتصال",
|
|
"notConnected": "غير متصل",
|
|
"clickToConnect": "انقر اتصال لبدء قذيفة تفاعلية",
|
|
"connectingTo": "جاري الاتصال بـ {{containerName}}...",
|
|
"containerMustBeRunningToViewStats": "يجب أن يكون الحاوية قيد التشغيل لعرض الإحصائيات",
|
|
"failedToFetchStats": "فشل في جلب الإحصائيات",
|
|
"noContainersFound": "لم يتم العثور على حاويات",
|
|
"noContainersFoundHint": "ابدأ بإنشاء حاويات على الخادم الخاص بك",
|
|
"searchPlaceholder": "البحث عن طريق الاسم أو الصورة أو المعرف...",
|
|
"filterByStatusPlaceholder": "تصفية حسب الحالة",
|
|
"allContainersCount": "الكل ({{count}})",
|
|
"statusCount": "{{status}} ({{count}})",
|
|
"noContainersMatchFilters": "لا توجد حاويات تطابق الفلاتر الخاصة بك",
|
|
"noContainersMatchFiltersHint": "حاول تعديل البحث أو الفلتر الخاص بك",
|
|
"containerStarted": "بدأ الحاوية {{name}}",
|
|
"failedToStartContainer": "فشل بدء تشغيل الحاوية: {{error}}",
|
|
"containerStopped": "تم إيقاف الحاوية {{name}}",
|
|
"failedToStopContainer": "فشل إيقاف الحاوية: {{error}}",
|
|
"containerRestarted": "تم إعادة تشغيل الحاوية {{name}}",
|
|
"failedToRestartContainer": "فشل إعادة تشغيل الحاوية: {{error}}",
|
|
"containerUnpaused": "الحاوية {{name}} غير متوقفة مؤقتاً",
|
|
"containerPaused": "الحاوية {{name}} متوقفة مؤقتاً",
|
|
"failedToTogglePauseContainer": "فشل في حاوية {{action}} : {{error}}",
|
|
"containerRemoved": "تمت إزالة الحاوية {{name}}",
|
|
"failedToRemoveContainer": "فشل إزالة الحاوية: {{error}}",
|
|
"image": "صورة:",
|
|
"idLabel": "ID:",
|
|
"ports": "المنافذ",
|
|
"noPorts": "لا",
|
|
"created": "تم إنشاؤه:",
|
|
"start": "ابدأ",
|
|
"stop": "توقف",
|
|
"unpause": "Unpause",
|
|
"pause": "إيقاف",
|
|
"restart": "إعادة التشغيل",
|
|
"removeContainer": "إزالة الحاوية",
|
|
"confirmRemoveContainer": "هل أنت متأكد من أنك تريد إزالة الحاوية\"{{name}}\"؟",
|
|
"runningContainerWarning": "تحذير: هذه الحاوية قيد التشغيل حاليا وسيتم إزالتها بالقوة.",
|
|
"removing": "إزالة:",
|
|
"containerNotFound": "الحاوية غير موجودة",
|
|
"backToList": "العودة إلى القائمة",
|
|
"logs": "السجلات",
|
|
"stats": "إحصائيات",
|
|
"consoleTab": "وحدة",
|
|
"failedToFetchLogs": "فشل في جلب السجلات: {{error}}",
|
|
"failedToDownloadLogs": "فشل تنزيل السجلات: {{error}}",
|
|
"linesToShow": "خطوط لإظهارها",
|
|
"last50Lines": "آخر 50 سطر",
|
|
"last100Lines": "آخر 100 سطر",
|
|
"last500Lines": "آخر 500 سطر",
|
|
"last1000Lines": "آخر 1000 سطر",
|
|
"allLogs": "جميع السجلات",
|
|
"showTimestamps": "إظهار الطوابع الزمنية",
|
|
"autoRefresh": "تحديث تلقائي",
|
|
"filterLogsPlaceholder": "تصفية السجلات...",
|
|
"noLogsAvailable": "لا توجد سجلات متاحة"
|
|
},
|
|
"terminal": {
|
|
"title": "المحطة",
|
|
"connect": "الاتصال بالمضيف",
|
|
"disconnect": "قطع الاتصال",
|
|
"clear": "مسح",
|
|
"copy": "نسخ",
|
|
"paste": "لصق",
|
|
"find": "البحث",
|
|
"fullscreen": "ملء الشاشة",
|
|
"splitHorizontal": "تقسيم أفقي",
|
|
"splitVertical": "تقسيم عمودي",
|
|
"closePanel": "أغلق اللوحة",
|
|
"reconnect": "إعادة الاتصال",
|
|
"sessionEnded": "انتهت الجلسة",
|
|
"connectionLost": "فقدان الاتصال",
|
|
"error": "خطأ: {{message}}",
|
|
"disconnected": "قطع",
|
|
"connectionClosed": "تم إغلاق الاتصال",
|
|
"connectionError": "خطأ في الاتصال: {{message}}",
|
|
"connected": "متصل",
|
|
"sshConnected": "تم إنشاء اتصال SSH",
|
|
"authError": "فشل المصادقة: {{message}}",
|
|
"unknownError": "حدث خطأ غير معروف",
|
|
"messageParseError": "فشل تحليل رسالة الخادم",
|
|
"websocketError": "خطأ في اتصال WebSocket",
|
|
"connecting": "جاري الاتصال...",
|
|
"reconnecting": "إعادة الاتصال... ({{attempt}}/{{max}})",
|
|
"reconnected": "تمت إعادة الاتصال بنجاح",
|
|
"maxReconnectAttemptsReached": "تم بلوغ الحد الأقصى لمحاولات إعادة الاتصال",
|
|
"connectionTimeout": "مهلة الاتصال",
|
|
"terminalTitle": "المحطة الطرفية - {{host}}",
|
|
"terminalWithPath": "المحطة الطرفية - {{host}}:{{path}}",
|
|
"runTitle": "تشغيل {{command}} - {{host}}",
|
|
"totpRequired": "المصادقة الثنائية مطلوبة",
|
|
"totpCodeLabel": "رمز التحقق",
|
|
"totpPlaceholder": "000000",
|
|
"totpVerify": "تحقق",
|
|
"warpgateAuthRequired": "مطلوب مصادقة التحذير",
|
|
"warpgateSecurityKey": "مفتاح الأمان",
|
|
"warpgateAuthUrl": "رابط المصادقة",
|
|
"warpgateOpenBrowser": "فتح في المتصفح",
|
|
"warpgateContinue": "لقد أكملت المصادقة",
|
|
"warpgateTimeout": "انتهت مهلة مصادقة التحذير. الرجاء إعادة الاتصال.",
|
|
"sudoPasswordPopupTitle": "إدراج كلمة المرور؟",
|
|
"sudoPasswordPopupHint": "اضغط Enter للإدراج ، Esc للإلغاء",
|
|
"sudoPasswordPopupConfirm": "Insert",
|
|
"sudoPasswordPopupDismiss": "تجاهل",
|
|
"websocketAbnormalClose": "تم إغلاق الاتصال بشكل غير متوقع. قد يكون ذلك بسبب مشكلة اعدادات الوكيل العكسي أو SSL. الرجاء التحقق من سجلات الخادم.",
|
|
"totpInvalid": "الرمز غير صالح. الرجاء المحاولة مرة أخرى.",
|
|
"authMethodFallback": "فشلت عملية المصادقة {{method}} . جرب طريقة بديلة...",
|
|
"authenticationRequired": "مطلوب المصادقة",
|
|
"connectionLogTitle": "سجل الاتصال",
|
|
"connectionLogCopy": "نسخ السجلات إلى الحافظة",
|
|
"connectionLogClear": "مسح السجلات",
|
|
"connectionLogEmpty": "لا توجد سجلات اتصال بعد",
|
|
"connectionLogConnecting": "جاري الاتصال بالمضيف...",
|
|
"connectionLogCopied": "سجلات الاتصال نسخت إلى الحافظة",
|
|
"connectionLogCopyFailed": "فشل في نسخ السجلات إلى الحافظة",
|
|
"allAuthMethodsFailed": "فشلت جميع طرق المصادقة. الرجاء التحقق من بيانات الاعتماد الخاصة بك.",
|
|
"methodNotSupported": "الخادم لا يدعم المصادقة {{method}} . الطرق المتاحة: {{available}}",
|
|
"retryWithMethod": "إعادة المحاولة مع {{method}}",
|
|
"automaticFallback": "جرب مصادقة {{method}} تلقائياً...",
|
|
"totpTimeout": "انتهت مهلة التحقق من TOTP. الرجاء إعادة الاتصال.",
|
|
"passwordTimeout": "انتهت مهلة التحقق من كلمة المرور. الرجاء إعادة الاتصال.",
|
|
"connectionRejected": "تم رفض الاتصال بواسطة الخادم. الرجاء التحقق من المصادقة الخاصة بك وتكوين الشبكة."
|
|
},
|
|
"fileManager": {
|
|
"title": "مدير الملفات",
|
|
"file": "ملف",
|
|
"folder": "مجلد",
|
|
"connectToSsh": "الاتصال بSSH لاستخدام عمليات الملفات",
|
|
"uploadFile": "تحميل ملف",
|
|
"downloadFile": "تنزيل",
|
|
"extractArchive": "استخراج الأرشيف",
|
|
"extractingArchive": "استخراج {{name}}...",
|
|
"archiveExtractedSuccessfully": "تم استخراج {{name}} بنجاح",
|
|
"extractFailed": "فشل الاستخراج",
|
|
"compressFile": "ضغط الملف",
|
|
"compressFiles": "ضغط الملفات",
|
|
"compressFilesDesc": "ضغط العناصر {{count}} إلى أرشيف",
|
|
"archiveName": "اسم الأرشيف",
|
|
"enterArchiveName": "أدخل اسم الأرشيف...",
|
|
"compressionFormat": "تنسيق الضغط",
|
|
"selectedFiles": "الملفات المحددة",
|
|
"andMoreFiles": "والمزيد {{count}} ...",
|
|
"compress": "ضغط",
|
|
"compressingFiles": "ضغط العناصر {{count}} إلى {{name}}...",
|
|
"filesCompressedSuccessfully": "تم إنشاء {{name}} بنجاح",
|
|
"compressFailed": "فشل الضغط",
|
|
"edit": "تحرير",
|
|
"preview": "معاينة",
|
|
"previous": "السابق",
|
|
"next": "التالي",
|
|
"pageXOfY": "الصفحة {{current}} من {{total}}",
|
|
"zoomOut": "تكبير خارج",
|
|
"zoomIn": "تكبير في",
|
|
"newFile": "ملف جديد",
|
|
"newFolder": "مجلد جديد",
|
|
"rename": "إعادة تسمية",
|
|
"renameItem": "إعادة تسمية العنصر",
|
|
"deleteItem": "حذف العنصر",
|
|
"currentPath": "المسار الحالي",
|
|
"uploadFileTitle": "تحميل ملف",
|
|
"maxFileSize": "الحد الأقصى: 1GB (JSON) / 5GB (Binary) - الملفات الكبيرة المدعومة",
|
|
"removeFile": "إزالة الملف",
|
|
"clickToSelectFile": "انقر لتحديد ملف",
|
|
"chooseFile": "اختر ملف",
|
|
"uploading": "تحميل...",
|
|
"downloading": "تنزيل...",
|
|
"uploadingFile": "تحميل {{name}}...",
|
|
"uploadingLargeFile": "تحميل ملف كبير {{name}} ({{size}})...",
|
|
"downloadingFile": "جاري تحميل {{name}}...",
|
|
"creatingFile": "إنشاء {{name}}...",
|
|
"creatingFolder": "إنشاء {{name}}...",
|
|
"deletingItem": "حذف {{type}} {{name}}...",
|
|
"renamingItem": "إعادة تسمية {{type}} {{oldName}} إلى {{newName}}...",
|
|
"createNewFile": "إنشاء ملف جديد",
|
|
"fileName": "اسم الملف",
|
|
"creating": "إنشاء...",
|
|
"createFile": "إنشاء ملف",
|
|
"createNewFolder": "إنشاء مجلد جديد",
|
|
"folderName": "اسم المجلد",
|
|
"createFolder": "إنشاء مجلد",
|
|
"warningCannotUndo": "تحذير: لا يمكن التراجع عن هذا الإجراء",
|
|
"itemPath": "مسار العنصر",
|
|
"thisIsDirectory": "هذا هو الدليل (سيتم الحذف بشكل متكرر)",
|
|
"deleting": "حذف...",
|
|
"currentPathLabel": "المسار الحالي",
|
|
"newName": "اسم جديد",
|
|
"thisIsDirectoryRename": "هذا دليل",
|
|
"renaming": "إعادة التسمية...",
|
|
"fileUploadedSuccessfully": "الملف \"{{name}}تم تحميله بنجاح",
|
|
"failedToUploadFile": "فشل في تحميل الملف",
|
|
"fileDownloadedSuccessfully": "الملف \"{{name}}تم تنزيله بنجاح",
|
|
"failedToDownloadFile": "فشل تنزيل الملف",
|
|
"noFileContent": "لم يتم استلام محتوى الملف",
|
|
"filePath": "مسار الملف",
|
|
"fileCreatedSuccessfully": "تم إنشاء الملف \"{{name}}بنجاح",
|
|
"failedToCreateFile": "فشل في إنشاء الملف",
|
|
"folderCreatedSuccessfully": "المجلد \"{{name}}\" تم إنشاؤه بنجاح",
|
|
"failedToCreateFolder": "فشل في إنشاء المجلد",
|
|
"failedToCreateItem": "فشل إنشاء العنصر",
|
|
"operationFailed": "فشلت العملية {{operation}} ل {{name}}: {{error}}",
|
|
"failedToResolveSymlink": "فشل حل الارتباط الرمزي",
|
|
"itemDeletedSuccessfully": "تم حذف {{type}} بنجاح",
|
|
"itemsDeletedSuccessfully": "تم حذف {{count}} عنصرًا بنجاح",
|
|
"failedToDeleteItems": "فشل حذف العناصر",
|
|
"sudoPasswordRequired": "كلمة مرور المسؤول مطلوبة",
|
|
"enterSudoPassword": "أدخل كلمة مرور sudo لمتابعة هذه العملية",
|
|
"sudoPassword": "كلمة المرور",
|
|
"sudoOperationFailed": "فشلت عملية سودو",
|
|
"sudoAuthFailed": "فشل مصادقة سودو",
|
|
"deleteOperation": "حذف الملفات/المجلدات",
|
|
"dragFilesToUpload": "إسقاط الملفات هنا لتحميل",
|
|
"emptyFolder": "هذا المجلد فارغ",
|
|
"itemCount": "عناصر {{count}}",
|
|
"selectedCount": "تم اختيار {{count}}",
|
|
"searchFiles": "البحث في الملفات...",
|
|
"upload": "تحميل",
|
|
"selectHostToStart": "حدد المضيف لبدء إدارة الملفات",
|
|
"failedToConnect": "فشل الاتصال بSSH",
|
|
"failedToLoadDirectory": "فشل تحميل الدليل",
|
|
"noSSHConnection": "لا يوجد اتصال SSH متوفر",
|
|
"enterFolderName": "أدخل اسم المجلد:",
|
|
"enterFileName": "أدخل اسم الملف:",
|
|
"copy": "نسخ",
|
|
"cut": "قطع",
|
|
"paste": "لصق",
|
|
"copyPath": "نسخ المسار",
|
|
"copyPaths": "نسخ المسارات",
|
|
"delete": "حذف",
|
|
"properties": "الخصائص",
|
|
"refresh": "تحديث",
|
|
"downloadFiles": "تحميل ملفات {{count}} إلى المتصفح",
|
|
"copyFiles": "نسخ العناصر {{count}}",
|
|
"cutFiles": "قطع العناصر {{count}}",
|
|
"deleteFiles": "حذف العناصر {{count}}",
|
|
"filesCopiedToClipboard": "تم نسخ العناصر {{count}} إلى الحافظة",
|
|
"filesCutToClipboard": "{{count}} عناصر قُطعت على الحافظة",
|
|
"pathCopiedToClipboard": "تم نسخ المسار إلى الحافظة",
|
|
"pathsCopiedToClipboard": "تم نسخ المسارات {{count}} إلى الحافظة",
|
|
"failedToCopyPath": "فشل نسخ المسار إلى الحافظة",
|
|
"movedItems": "نقل عناصر {{count}}",
|
|
"failedToDeleteItem": "فشل في حذف العنصر",
|
|
"itemRenamedSuccessfully": "تم تغيير اسم {{type}} بنجاح",
|
|
"failedToRenameItem": "فشل في إعادة تسمية العنصر",
|
|
"download": "تنزيل",
|
|
"permissions": "الأذونات",
|
|
"size": "الحجم",
|
|
"modified": "معدّل",
|
|
"path": "المسار",
|
|
"confirmDelete": "هل أنت متأكد من أنك تريد حذف {{name}}؟",
|
|
"uploadSuccess": "تم رفع الملف بنجاح",
|
|
"uploadFailed": "فشل تحميل الملف",
|
|
"downloadSuccess": "تم تنزيل الملف بنجاح",
|
|
"downloadFailed": "فشل تنزيل الملف",
|
|
"permissionDenied": "تم رفض الإذن",
|
|
"checkDockerLogs": "تحقق من سجلات Docker للحصول على معلومات الخطأ المفصلة",
|
|
"internalServerError": "حدث خطأ داخلي في الخادم",
|
|
"serverError": "خطأ في الخادم",
|
|
"error": "خطأ",
|
|
"requestFailed": "فشل الطلب مع رمز الحالة",
|
|
"unknownFileError": "غير معروف",
|
|
"cannotReadFile": "لا يمكن قراءة الملف",
|
|
"noSshSessionId": "لا يتوفر معرف جلسة SSH",
|
|
"noFilePath": "لا يوجد مسار ملف متاح",
|
|
"noCurrentHost": "لا يوجد مضيف حالي متاح",
|
|
"fileSavedSuccessfully": "تم حفظ الملف بنجاح",
|
|
"saveTimeout": "حفظ انتهت مهلة العملية. ربما تم حفظ الملف بنجاح، ولكن العملية استغرقت وقتا طويلا جدا لإكمالها. تحقق من سجلات Docker للحصول على التأكيد.",
|
|
"failedToSaveFile": "فشل في حفظ الملف",
|
|
"deletedSuccessfully": "تم الحذف بنجاح",
|
|
"connectToServer": "الاتصال بالخادم",
|
|
"selectServerToEdit": "حدد خادم من الشريط الجانبي لبدء تحرير الملفات",
|
|
"fileOperations": "عمليات الملف",
|
|
"confirmDeleteMessage": "هل أنت متأكد من أنك تريد حذف {{name}}؟",
|
|
"confirmDeleteSingleItem": "هل أنت متأكد من أنك تريد حذف \"{{name}}\" بشكل دائم؟",
|
|
"confirmDeleteMultipleItems": "هل أنت متأكد من أنك تريد حذف العناصر {{count}} نهائياً؟",
|
|
"confirmDeleteMultipleItemsWithFolders": "هل أنت متأكد من أنك تريد حذف العناصر {{count}} نهائيًا؟ هذا يشمل المجلدات ومحتوياتها.",
|
|
"confirmDeleteFolder": "هل أنت متأكد من أنك تريد حذف المجلد \"{{name}}\" و جميع محتوياته؟",
|
|
"deleteDirectoryWarning": "سيؤدي هذا إلى حذف المجلد وجميع محتوياته.",
|
|
"actionCannotBeUndone": "لا يمكن التراجع عن هذا الإجراء.",
|
|
"permanentDeleteWarning": "لا يمكن التراجع عن هذا الإجراء. سيتم حذف العنصر (العناصر) بشكل دائم من الخادم.",
|
|
"recent": "حديثاً",
|
|
"pinned": "مثبتة",
|
|
"folderShortcuts": "اختصارات المجلد",
|
|
"noRecentFiles": "لا توجد ملفات حديثة.",
|
|
"noPinnedFiles": "لا توجد ملفات مثبتة.",
|
|
"enterFolderPath": "أدخل مسار المجلد",
|
|
"noShortcuts": "لا يوجد اختصار.",
|
|
"searchFilesAndFolders": "البحث في الملفات والمجلدات...",
|
|
"noFilesOrFoldersFound": "لم يتم العثور على ملفات أو مجلدات.",
|
|
"failedToConnectSSH": "فشل الاتصال بSSH",
|
|
"failedToReconnectSSH": "فشل في إعادة الاتصال بجلسة SSH",
|
|
"failedToListFiles": "فشل في قائمة الملفات",
|
|
"fetchHomeDataTimeout": "انتهت مهلة جلب البيانات الرئيسية",
|
|
"sshStatusCheckTimeout": "انتهت مهلة التحقق من حالة SSH",
|
|
"sshReconnectionTimeout": "انتهت مهلة إعادة توصيل SSH",
|
|
"saveOperationTimeout": "انتهت مهلة حفظ العملية",
|
|
"cannotSaveFile": "لا يمكن حفظ الملف",
|
|
"dragSystemFilesToUpload": "اسحب ملفات النظام هنا لتحميل",
|
|
"dragFilesToWindowToDownload": "اسحب الملفات خارج النافذة للتحميل",
|
|
"openTerminalHere": "فتح المحطة الطرفية هنا",
|
|
"run": "تشغيل",
|
|
"saveToSystem": "حفظ كـ...",
|
|
"selectLocationToSave": "حدد الموقع المراد حفظه",
|
|
"openTerminalInFolder": "فتح المحطة الطرفية في هذا المجلد",
|
|
"openTerminalInFileLocation": "فتح المحطة الطرفية في موقع الملف",
|
|
"terminalWithPath": "المحطة الطرفية - {{host}}:{{path}}",
|
|
"runningFile": "قيد التشغيل - {{file}}",
|
|
"onlyRunExecutableFiles": "يمكن فقط تشغيل الملفات القابلة للتنفيذ",
|
|
"noHostSelected": "لم يتم اختيار مضيف",
|
|
"starred": "نجوم",
|
|
"shortcuts": "الاختصارات",
|
|
"directories": "المجلدات",
|
|
"removedFromRecentFiles": "إزالة \"{{name}}\" من الملفات الأخيرة",
|
|
"removeFailed": "فشل الإزالة",
|
|
"unpinnedSuccessfully": "تم إلغاء تثبيت \"{{name}}بنجاح",
|
|
"unpinFailed": "فشل إلغاء التثبيت",
|
|
"removedShortcut": "إزالة الاختصار\"{{name}}\"",
|
|
"removeShortcutFailed": "فشل إزالة الاختصار",
|
|
"clearedAllRecentFiles": "مسح جميع الملفات الأخيرة",
|
|
"clearFailed": "فشل المسح",
|
|
"removeFromRecentFiles": "إزالة من الملفات الأخيرة",
|
|
"clearAllRecentFiles": "مسح جميع الملفات الأخيرة",
|
|
"unpinFile": "إلغاء تثبيت الملف",
|
|
"removeShortcut": "إزالة الاختصار",
|
|
"saveFilesToSystem": "حفظ الملفات {{count}} كـ...",
|
|
"pinFile": "تثبيت ملف",
|
|
"addToShortcuts": "إضافة إلى الاختصارات",
|
|
"downloadToDefaultLocation": "تحميل إلى الموقع الافتراضي",
|
|
"pasteFailed": "فشل اللصق",
|
|
"noUndoableActions": "لا إجراءات غير قابلة للإلغاء",
|
|
"undoCopySuccess": "عملية نسخ غير منسوخة: الملفات المحذوفة {{count}} منسوخة",
|
|
"undoCopyFailedDelete": "فشل التراجع: لا يمكن حذف أي ملفات تم نسخها",
|
|
"undoCopyFailedNoInfo": "فشل التراجع: لم يتم العثور على معلومات الملفات المنسوخة",
|
|
"undoMoveSuccess": "إلغاء تشغيل النقل: نقل الملفات {{count}} إلى الموقع الأصلي",
|
|
"undoMoveFailedMove": "فشل التراجع: لا يمكن نقل أي ملفات إلى الوراء",
|
|
"undoMoveFailedNoInfo": "فشل التراجع: تعذر العثور على معلومات الملف المنقولة",
|
|
"undoDeleteNotSupported": "لا يمكن التراجع عن عملية الحذف: تم حذف الملفات نهائيا من الخادم",
|
|
"undoTypeNotSupported": "نوع عملية التراجع غير مدعوم",
|
|
"undoOperationFailed": "فشلت عملية التراجع",
|
|
"unknownError": "خطأ غير معروف",
|
|
"enterPath": "أدخل المسار...",
|
|
"editPath": "تحرير المسار",
|
|
"confirm": "تأكيد",
|
|
"cancel": "إلغاء",
|
|
"find": "العثور على...",
|
|
"replaceWith": "استبدل بـ...",
|
|
"replace": "استبدل",
|
|
"replaceAll": "استبدال الكل",
|
|
"downloadInstead": "تحميل بدلاً من ذلك",
|
|
"keyboardShortcuts": "اختصارات لوحة المفاتيح",
|
|
"searchAndReplace": "البحث والاستبدال",
|
|
"editing": "تحرير",
|
|
"navigation": "Navigation",
|
|
"code": "الكود",
|
|
"search": "البحث",
|
|
"findNext": "البحث عن التالي",
|
|
"findPrevious": "البحث عن السابق",
|
|
"save": "حفظ",
|
|
"selectAll": "حدد الكل",
|
|
"undo": "التراجع",
|
|
"redo": "إعادة",
|
|
"goToLine": "الذهاب إلى الخط",
|
|
"moveLineUp": "تحريك الخط للأعلى",
|
|
"moveLineDown": "تحريك الخط للأسفل",
|
|
"toggleComment": "تبديل التعليق",
|
|
"indent": "منيع",
|
|
"outdent": "عتيق",
|
|
"autoComplete": "Auto Complete",
|
|
"imageLoadError": "فشل في تحميل الصورة",
|
|
"rotate": "تدوير",
|
|
"originalSize": "الحجم الأصلي",
|
|
"startTyping": "ابدأ الكتابة...",
|
|
"unknownSize": "حجم غير معروف",
|
|
"fileIsEmpty": "الملف فارغ",
|
|
"largeFileWarning": "تحذير كبير من الملف",
|
|
"largeFileWarningDesc": "هذا الملف هو {{size}} في الحجم، مما قد يسبب مشاكل في الأداء عند فتحه كنص.",
|
|
"fileNotFoundAndRemoved": "لم يتم العثور على الملف \"{{name}}\" وتم إزالته من الملفات الأخيرة/المثبتة",
|
|
"failedToLoadFile": "فشل تحميل الملف: {{error}}",
|
|
"serverErrorOccurred": "حدث خطأ في الخادم. الرجاء المحاولة مرة أخرى لاحقاً.",
|
|
"autoSaveFailed": "فشل الحفظ التلقائي",
|
|
"fileAutoSaved": "حفظ الملف تلقائياً",
|
|
"moveFileFailed": "فشل في نقل {{name}}",
|
|
"moveOperationFailed": "فشلت عملية النقل",
|
|
"canOnlyCompareFiles": "يمكن فقط مقارنة ملفين",
|
|
"comparingFiles": "مقارنة الملفات: {{file1}} و {{file2}}",
|
|
"dragFailed": "فشلت عملية السحب",
|
|
"filePinnedSuccessfully": "الملف \"{{name}}تم تثبيته بنجاح",
|
|
"pinFileFailed": "فشل في تثبيت الملف",
|
|
"fileUnpinnedSuccessfully": "تم إلغاء تثبيت الملف \"{{name}}بنجاح",
|
|
"unpinFileFailed": "فشل إلغاء تثبيت الملف",
|
|
"shortcutAddedSuccessfully": "اختصار المجلد\"{{name}}أضيف بنجاح",
|
|
"addShortcutFailed": "فشل في إضافة اختصار",
|
|
"operationCompletedSuccessfully": "{{operation}} {{count}} عناصر بنجاح",
|
|
"operationCompleted": "{{operation}} {{count}} عنصر",
|
|
"downloadFileSuccess": "تم تنزيل الملف {{name}} بنجاح",
|
|
"downloadFileFailed": "فشل التحميل",
|
|
"moveTo": "الانتقال إلى {{name}}",
|
|
"diffCompareWith": "الفرق بين {{name}}",
|
|
"dragOutsideToDownload": "اسحب إلى خارج النافذة للتحميل ( ملفات{{count}})",
|
|
"newFolderDefault": "مجلد",
|
|
"newFileDefault": "Newfile.txt",
|
|
"successfullyMovedItems": "تم نقل العناصر {{count}} بنجاح إلى {{target}}",
|
|
"move": "نقل",
|
|
"searchInFile": "البحث في الملف (Ctrl+F)",
|
|
"showKeyboardShortcuts": "إظهار اختصارات لوحة المفاتيح",
|
|
"startWritingMarkdown": "بدء كتابة محتوى markdown الخاص بك...",
|
|
"loadingFileComparison": "جارٍ تحميل مقارنة الملفات...",
|
|
"reload": "Reload",
|
|
"compare": "قارن",
|
|
"sideBySide": "جانب جانبي",
|
|
"inline": "مضمن",
|
|
"fileComparison": "مقارنة الملفات: {{file1}} مقابل {{file2}}",
|
|
"fileTooLarge": "الملف كبير جدا: {{error}}",
|
|
"sshConnectionFailed": "فشل الاتصال بSSH. الرجاء التحقق من اتصالك بـ {{name}} ({{ip}}:{{port}})",
|
|
"loadFileFailed": "فشل تحميل الملف: {{error}}",
|
|
"connecting": "جاري الاتصال...",
|
|
"connectedSuccessfully": "تم الاتصال بنجاح",
|
|
"totpVerificationFailed": "فشل التحقق من TOTP",
|
|
"warpgateVerificationFailed": "فشلت مصادقة الWarpgate",
|
|
"authenticationFailed": "فشل المصادقة",
|
|
"verificationCodePrompt": "رمز التحقق:",
|
|
"changePermissions": "تغيير الأذونات",
|
|
"changePermissionsDesc": "تعديل أذونات الملف لـ",
|
|
"currentPermissions": "الأذونات الحالية",
|
|
"newPermissions": "أذونات جديدة",
|
|
"owner": "المالك",
|
|
"group": "مجموعة",
|
|
"others": "أخرى",
|
|
"read": "قراءة",
|
|
"write": "كتابة",
|
|
"execute": "تنفيذ",
|
|
"permissionsChangedSuccessfully": "تم تغيير الأذونات بنجاح",
|
|
"failedToChangePermissions": "فشل في تغيير الأذونات"
|
|
},
|
|
"tunnel": {
|
|
"log": {
|
|
"connecting": "إنشاء اتصال بالنفق...",
|
|
"sourceConnecting": "جاري الاتصال بمضيف المصدر {{host}}...",
|
|
"sourceConnected": "متصل بالمستضيف المصدر",
|
|
"endpointResolving": "حل مضيف نقطة النهاية {{host}}...",
|
|
"endpointResolved": "تم حل مضيف نقطة النهاية",
|
|
"forwarding": "إعداد إعادة توجيه المنفذ {{localPort}} → {{remotePort}}...",
|
|
"connected": "تم إنشاء النفق بنجاح",
|
|
"retrying": "فشل الاتصال، إعادة المحاولة في {{countdown}}s (محاولة {{attempt}}/{{max}})...",
|
|
"retryExhausted": "وصلت محاولات إعادة المحاولة القصوى",
|
|
"error": "فشل الاتصال بالنفق: {{error}}"
|
|
}
|
|
},
|
|
"tunnels": {
|
|
"title": "أنفاق SSH",
|
|
"noSshTunnels": "لا توجد أنفاق SSH",
|
|
"createFirstTunnelMessage": "لم تقم بإنشاء أي أنفاق SSH حتى الآن. تكوين اتصالات الأنفاق في مدير المضيف للبدء.",
|
|
"connected": "متصل",
|
|
"disconnected": "قطع",
|
|
"connecting": "جاري الاتصال...",
|
|
"disconnecting": "قطع الاتصال...",
|
|
"unknownTunnelStatus": "غير معروف",
|
|
"statusUnknown": "غير معروف",
|
|
"unknown": "غير معروف",
|
|
"error": "خطأ",
|
|
"failed": "فشل",
|
|
"retrying": "إعادة المحاولة",
|
|
"waiting": "في انتظار",
|
|
"waitingForRetry": "في انتظار إعادة المحاولة",
|
|
"retryingConnection": "إعادة محاولة الاتصال",
|
|
"canceling": "إلغاء...",
|
|
"connect": "الاتصال",
|
|
"disconnect": "قطع الاتصال",
|
|
"cancel": "إلغاء",
|
|
"port": "المنفذ",
|
|
"attempt": "محاولة {{current}} من {{max}}",
|
|
"nextRetryIn": "إعادة المحاولة التالية في {{seconds}} ثانية",
|
|
"checkDockerLogs": "تحقق من سجلات Docker لسبب الخطأ، انضم إلى",
|
|
"orCreate": "أو إنشاء ",
|
|
"noTunnelConnections": "لا توجد اتصالات نفق تم تكوينها",
|
|
"tunnelConnections": "اتصالات النفق",
|
|
"addTunnel": "إضافة نفق",
|
|
"editTunnel": "تعديل النفق",
|
|
"deleteTunnel": "حذف النفق",
|
|
"tunnelName": "اسم النفق",
|
|
"localPort": "المنفذ المحلي",
|
|
"remoteHost": "المضيف البعيد",
|
|
"remotePort": "المنفذ البعيد",
|
|
"autoStart": "بدء التشغيل التلقائي",
|
|
"status": "الحالة",
|
|
"active": "نشط",
|
|
"inactive": "غير نشط",
|
|
"start": "ابدأ",
|
|
"stop": "توقف",
|
|
"restart": "إعادة التشغيل",
|
|
"connectionType": "نوع الاتصال",
|
|
"local": "محلي",
|
|
"remote": "عن بعد",
|
|
"dynamic": "ديناميكية",
|
|
"unknownConnectionStatus": "غير معروف",
|
|
"portMapping": "المنفذ {{sourcePort}} → {{endpointHost}}:{{endpointPort}}",
|
|
"endpointHostNotFound": "لم يتم العثور على مضيف نقطة النهاية",
|
|
"discord": "ديسكورد",
|
|
"githubIssue": "مشكلة GitHub",
|
|
"forHelp": "للحصول على مساعدة"
|
|
},
|
|
"serverStats": {
|
|
"title": "إحصائيات الخادم",
|
|
"cpu": "المعالج",
|
|
"memory": "الذاكرة",
|
|
"disk": "قرص",
|
|
"network": "الشبكة",
|
|
"uptime": "وقت التحديث",
|
|
"loadAverage": "المتوسط: {{avg1}}، {{avg5}}، {{avg15}}",
|
|
"processes": "العمليات",
|
|
"connections": "اتصالات",
|
|
"usage": "الاستخدام",
|
|
"available": "متوفر",
|
|
"total": "المجموع",
|
|
"free": "مجاني",
|
|
"used": "مستخدم",
|
|
"percentage": "النسبة المئوية",
|
|
"refreshStatusAndMetrics": "تحديث الحالة والمقاييس",
|
|
"refreshStatus": "تحديث الحالة",
|
|
"fileManagerAlreadyOpen": "مدير الملفات مفتوح بالفعل لهذا المضيف",
|
|
"openFileManager": "فتح مدير الملفات",
|
|
"connecting": "جاري الاتصال...",
|
|
"connectionFailed": "فشل الاتصال بالخادم",
|
|
"cpuCores_one": "{{count}} المعالج",
|
|
"cpuCores_other": "{{count}} المعالج",
|
|
"naCpus": "N/A CPU(s)",
|
|
"loadAverageNA": "متوسط: لا /A",
|
|
"cpuUsage": "استخدام المعالج",
|
|
"memoryUsage": "استخدام الذاكرة",
|
|
"diskUsage": "استخدام القرص",
|
|
"rootStorageSpace": "مساحة تخزين الجذر",
|
|
"of": "من",
|
|
"feedbackMessage": "هل لديك أفكار حول ما يجب أن يأتي بعد إدارة الخادم؟ مشاركتهم على",
|
|
"failedToFetchHostConfig": "فشل في جلب إعدادات المضيف",
|
|
"failedToFetchStatus": "فشل في جلب حالة الخادم",
|
|
"failedToFetchMetrics": "فشل في جلب مقاييس الخادم",
|
|
"failedToFetchHomeData": "فشل في جلب البيانات الرئيسية",
|
|
"loadingMetrics": "جاري تحميل المقاييس...",
|
|
"refreshing": "تحديث...",
|
|
"serverOffline": "الخادم غير متصل",
|
|
"cannotFetchMetrics": "لا يمكن جلب المقاييس من الخادم غير متصل",
|
|
"totpRequired": "مطلوب مصادقة TOTP",
|
|
"totpUnavailable": "إحصائيات الخادم غير متوفرة لخوادم مزودة بتوتوب",
|
|
"totpVerified": "تم التحقق من توب ، وبدأت عملية جمع القياسات",
|
|
"totpFailed": "فشل التحقق من TOTP",
|
|
"totpInvalidCode": "رمز التحقق غير صالح",
|
|
"totpCancelled": "تم إلغاء مجموعة القياسات",
|
|
"authenticationFailed": "فشل المصادقة",
|
|
"noneAuthNotSupported": "إحصائيات الخادم لا تدعم نوع مصادقة 'لا شيء'.",
|
|
"load": "تحميل",
|
|
"editLayout": "تعديل التخطيط",
|
|
"cancelEdit": "إلغاء",
|
|
"addWidget": "إضافة أداة",
|
|
"saveLayout": "حفظ التخطيط",
|
|
"unsavedChanges": "التغييرات غير المحفوظة",
|
|
"layoutSaved": "تم حفظ التخطيط بنجاح",
|
|
"failedToSaveLayout": "فشل في حفظ التخطيط",
|
|
"systemInfo": "معلومات النظام",
|
|
"hostname": "Hostname",
|
|
"operatingSystem": "نظام التشغيل",
|
|
"kernel": "نواة",
|
|
"totalUptime": "إجمالي وقت التحديث",
|
|
"seconds": "ثواني",
|
|
"networkInterfaces": "واجهة الشبكة",
|
|
"noInterfacesFound": "لم يتم العثور على واجهات شبكة",
|
|
"totalProcesses": "مجموع العمليات",
|
|
"running": "تشغيل",
|
|
"noProcessesFound": "لم يتم العثور على عمليات",
|
|
"loginStats": "إحصائيات تسجيل دخول SSH",
|
|
"totalLogins": "إجمالي تسجيلات الدخول",
|
|
"uniqueIPs": "عناوين IP فريدة",
|
|
"recentSuccessfulLogins": "تسجيلات الدخول الأخيرة الناجحة",
|
|
"recentFailedAttempts": "المحاولات الفاشلة",
|
|
"noRecentLoginData": "لا توجد بيانات تسجيل دخول حديثة",
|
|
"from": "من",
|
|
"quickActions": "الإجراءات السريعة",
|
|
"executeQuickAction": "تنفيذ {{name}}",
|
|
"executingQuickAction": "تنفيذ {{name}}...",
|
|
"quickActionSuccess": "أكمل {{name}} بنجاح",
|
|
"quickActionFailed": "فشل {{name}}",
|
|
"quickActionError": "فشل في تنفيذ {{name}}",
|
|
"ports": {
|
|
"title": "منافذ الاستماع",
|
|
"protocol": "Protocol",
|
|
"port": "المنفذ",
|
|
"address": "العنوان",
|
|
"state": "الولاية",
|
|
"process": "العملية",
|
|
"noData": "لا توجد بيانات منافذ الاستماع"
|
|
},
|
|
"firewall": {
|
|
"title": "جدار الحماية",
|
|
"active": "نشط",
|
|
"inactive": "غير نشط",
|
|
"notDetected": "لم يتم الكشف",
|
|
"policy": "السياسة",
|
|
"rules": "القواعد",
|
|
"noRules": "لا توجد قواعد",
|
|
"noData": "لا تتوفر بيانات جدار الحماية",
|
|
"action": "اجراء",
|
|
"protocol": "Proto",
|
|
"port": "المنفذ",
|
|
"source": "المصدر",
|
|
"accept": "الوصول",
|
|
"drop": "دروب",
|
|
"reject": "استرجاع",
|
|
"anywhere": "في أي مكان"
|
|
}
|
|
},
|
|
"auth": {
|
|
"tagline": "إدارة خدمة SSH",
|
|
"description": "إدارة اتصال SSH آمنة وقوية وبديهية",
|
|
"welcomeBack": "مرحبا بكم مرة أخرى في TERMIX",
|
|
"createAccount": "إنشاء حساب TERMIX الخاص بك",
|
|
"continueExternal": "المتابعة مع المزود الخارجي",
|
|
"loginTitle": "تسجيل الدخول إلى Termix",
|
|
"registerTitle": "إنشاء حساب",
|
|
"loginButton": "تسجيل الدخول",
|
|
"registerButton": "تسجيل",
|
|
"forgotPassword": "نسيت كلمة المرور؟",
|
|
"rememberMe": "تذكر لي",
|
|
"noAccount": "ليس لديك حساب؟",
|
|
"hasAccount": "لديك حساب بالفعل؟",
|
|
"loginSuccess": "تم تسجيل الدخول بنجاح",
|
|
"loginFailed": "فشل تسجيل الدخول",
|
|
"registerSuccess": "تم التسجيل بنجاح",
|
|
"registerFailed": "فشل التسجيل",
|
|
"logoutSuccess": "تم تسجيل الخروج بنجاح",
|
|
"invalidCredentials": "اسم المستخدم أو كلمة المرور غير صالحة",
|
|
"accountCreated": "تم إنشاء الحساب بنجاح",
|
|
"passwordReset": "تم إرسال رابط إعادة تعيين كلمة المرور",
|
|
"twoFactorAuth": "المصادقة الثنائية",
|
|
"enterCode": "أدخل رمز التحقق",
|
|
"backupCode": "أو استخدم رمز النسخ الاحتياطي",
|
|
"verifyCode": "التحقق من الرمز",
|
|
"redirectingToApp": "إعادة التوجيه إلى التطبيق...",
|
|
"enableTwoFactor": "تمكين المصادقة الثنائية",
|
|
"disableTwoFactor": "تعطيل المصادقة الثنائية",
|
|
"scanQRCode": "مسح رمز QR هذا باستخدام تطبيق المصادقة الخاص بك",
|
|
"backupCodes": "رموز النسخ الاحتياطي",
|
|
"saveBackupCodes": "حفظ رموز النسخ الاحتياطي هذه في مكان آمن",
|
|
"twoFactorEnabledSuccess": "تم تمكين المصادقة الثنائية بنجاح!",
|
|
"twoFactorDisabled": "المصادقة الثنائية معطلة",
|
|
"newBackupCodesGenerated": "تم إنشاء رموز النسخ الاحتياطي الجديدة",
|
|
"backupCodesDownloaded": "تم تنزيل رموز النسخ الاحتياطي",
|
|
"pleaseEnterSixDigitCode": "الرجاء إدخال رمز من 6 أرقام",
|
|
"invalidVerificationCode": "رمز التحقق غير صالح",
|
|
"failedToDisableTotp": "فشل تعطيل TOTP",
|
|
"failedToGenerateBackupCodes": "فشل في إنشاء رموز النسخ الاحتياطي",
|
|
"enterPassword": "أدخل كلمة المرور",
|
|
"lockedOidcAuth": "مقفل (مصادقة OIDC)",
|
|
"twoFactorTitle": "المصادقة الثنائية",
|
|
"twoFactorProtected": "حسابك محمي مع المصادقة ذات العاملين",
|
|
"twoFactorActive": "المصادقة الثنائية نشطة حاليا على حسابك",
|
|
"disable2FA": "تعطيل 2FA",
|
|
"disableTwoFactorWarning": "تعطيل المصادقة الثنائية سيجعل حسابك أقل أمانا",
|
|
"passwordOrTotpCode": "كلمة المرور أو رمز TOTP",
|
|
"or": "أو",
|
|
"generateNewBackupCodesText": "إنشاء رموز نسخ احتياطي جديدة إذا فقدت رموز موجودة لديك",
|
|
"generateNewBackupCodes": "إنشاء رموز احتياطية جديدة",
|
|
"yourBackupCodes": "رموز النسخ الاحتياطي",
|
|
"download": "تنزيل",
|
|
"setupTwoFactorTitle": "تعيين المصادقة الثنائية",
|
|
"sshAuthenticationRequired": "مطلوب مصادقة SSH",
|
|
"sshNoKeyboardInteractive": "المصادقة التفاعلية لوحة المفاتيح غير متوفرة",
|
|
"sshAuthenticationFailed": "فشل المصادقة",
|
|
"sshAuthenticationTimeout": "مهلة المصادقة",
|
|
"sshNoKeyboardInteractiveDescription": "الخادم لا يدعم مصادقة لوحة المفاتيح التفاعلية. الرجاء توفير كلمة المرور أو مفتاح SSH الخاص بك.",
|
|
"sshAuthFailedDescription": "بيانات الاعتماد المقدمة غير صحيحة. الرجاء المحاولة مرة أخرى باستخدام بيانات اعتماد صالحة.",
|
|
"sshTimeoutDescription": "انتهت مهلة محاولة المصادقة. الرجاء المحاولة مرة أخرى.",
|
|
"sshProvideCredentialsDescription": "الرجاء تقديم بيانات اعتماد SSH الخاصة بك للاتصال بهذا الخادم.",
|
|
"sshPasswordDescription": "أدخل كلمة المرور لهذا الاتصال SSH.",
|
|
"sshKeyPasswordDescription": "إذا تم تشفير مفتاح SSH الخاص بك، أدخل كلمة المرور هنا.",
|
|
"step1ScanQR": "الخطوة 1: مسح رمز QR باستخدام تطبيق المصادقة الخاص بك",
|
|
"manualEntryCode": "رمز الإدخال اليدوي",
|
|
"cannotScanQRText": "إذا لم تتمكن من مسح رمز QR ، أدخل هذا الرمز يدوياً في تطبيق المصادقة الخاص بك",
|
|
"nextVerifyCode": "التالي : التحقق من الرمز",
|
|
"verifyAuthenticator": "تحقق من مصادقك",
|
|
"step2EnterCode": "الخطوة 2: أدخل الرمز المكون من 6 أرقام من تطبيق المصادقة",
|
|
"verificationCode": "رمز التحقق",
|
|
"back": "الرجوع",
|
|
"verifyAndEnable": "التحقق والتفعيل",
|
|
"saveBackupCodesTitle": "حفظ رموز النسخ الاحتياطي",
|
|
"step3StoreCodesSecurely": "الخطوة 3: تخزين هذه الرموز في مكان آمن",
|
|
"importantBackupCodesText": "حفظ رموز النسخ الاحتياطي هذه في موقع آمن. يمكنك استخدامها للوصول إلى حسابك إذا فقدت جهاز المصادقة الخاص بك.",
|
|
"completeSetup": "اكتمل الإعداد",
|
|
"notEnabledText": "المصادقة ذات عاملين تضيف طبقة أمان إضافية من خلال طلب رمز من تطبيق المصادقة عند تسجيل الدخول.",
|
|
"enableTwoFactorButton": "تمكين المصادقة الثنائية",
|
|
"addExtraSecurityLayer": "إضافة طبقة إضافية من الأمان إلى حسابك",
|
|
"firstUser": "المستخدم الأول",
|
|
"firstUserMessage": "أنت أول مستخدم وسيتم جعله مشرف. يمكنك عرض إعدادات المشرف في القائمة المنسدلة للمستخدم الجانبي. إذا كنت تعتقد أن هذا خطأ، تحقق من سجلات المرفأ، أو قم بإنشاء مشكلة GitHub .",
|
|
"external": "خارجي",
|
|
"loginWithExternal": "تسجيل الدخول مع المزود الخارجي",
|
|
"loginWithExternalDesc": "تسجيل الدخول باستخدام موفر الهوية الخارجي المعد الخاص بك",
|
|
"externalNotSupportedInElectron": "المصادقة الخارجية غير مدعومة في تطبيق إلكترون بعد. الرجاء استخدام إصدار الويب لتسجيل الدخول OIDC.",
|
|
"resetPasswordButton": "إعادة تعيين كلمة المرور",
|
|
"sendResetCode": "إرسال رمز إعادة التعيين",
|
|
"resetCodeDesc": "أدخل اسم المستخدم الخاص بك لتلقي رمز إعادة تعيين كلمة المرور. سيتم تسجيل الدخول في سجلات حاويات الجهاز التنزيلي.",
|
|
"resetCode": "Reset Code",
|
|
"verifyCodeButton": "التحقق من الرمز",
|
|
"enterResetCode": "أدخل الرمز المكون من 6 أرقام من سجلات حاويات الجهاز للمستخدم:",
|
|
"goToLogin": "الذهاب إلى تسجيل الدخول",
|
|
"newPassword": "كلمة المرور الجديدة",
|
|
"confirmNewPassword": "تأكيد كلمة المرور",
|
|
"enterNewPassword": "أدخل كلمة المرور الجديدة للمستخدم:",
|
|
"signUp": "تسجيل الدخول",
|
|
"mobileApp": "تطبيق الجوال",
|
|
"loggingInToMobileApp": "تسجيل الدخول إلى تطبيق الجوال",
|
|
"desktopApp": "تطبيق سطح المكتب",
|
|
"loggingInToDesktopApp": "تسجيل الدخول إلى تطبيق سطح المكتب",
|
|
"loggingInToDesktopAppViaWeb": "تسجيل الدخول إلى تطبيق سطح المكتب عبر واجهة الويب",
|
|
"loadingServer": "جاري تحميل الخادم...",
|
|
"authenticating": "المصادقة...",
|
|
"dataLossWarning": "إعادة تعيين كلمة المرور بهذه الطريقة ستؤدي إلى حذف جميع مضيفي SSH المحفوظين، والاعتمادات، والبيانات المشفرة الأخرى. لا يمكن التراجع عن هذا الإجراء. استخدم هذا فقط إذا كنت قد نسيت كلمة المرور الخاصة بك ولم يتم تسجيل الدخول.",
|
|
"authenticationDisabled": "المصادقة معطلة",
|
|
"authenticationDisabledDesc": "جميع طرق المصادقة معطلة حاليا. الرجاء الاتصال بالمسؤول.",
|
|
"passwordResetSuccess": "تم إعادة تعيين كلمة المرور بنجاح",
|
|
"passwordResetSuccessDesc": "تم إعادة تعيين كلمة المرور الخاصة بك بنجاح. يمكنك الآن تسجيل الدخول باستخدام كلمة المرور الجديدة."
|
|
},
|
|
"errors": {
|
|
"notFound": "لم يتم العثور على الصفحة",
|
|
"unauthorized": "الوصول غير المصرح به",
|
|
"forbidden": "الوصول محظور",
|
|
"serverError": "خطأ في الخادم",
|
|
"networkError": "خطأ في الشبكة",
|
|
"databaseConnection": "تعذر الاتصال بقاعدة البيانات",
|
|
"unknownError": "خطأ غير معروف",
|
|
"loginFailed": "فشل تسجيل الدخول",
|
|
"failedPasswordReset": "فشل في بدء إعادة تعيين كلمة المرور",
|
|
"failedVerifyCode": "فشل التحقق من إعادة تعيين الرمز",
|
|
"failedCompleteReset": "فشل في إكمال إعادة تعيين كلمة المرور",
|
|
"invalidTotpCode": "Invalid TOTP code",
|
|
"failedOidcLogin": "فشل في بدء تسجيل الدخول OIDC",
|
|
"failedUserInfo": "فشل الحصول على معلومات المستخدم بعد تسجيل الدخول OIDC",
|
|
"oidcAuthFailed": "فشل مصادقة OIDC",
|
|
"noTokenReceived": "لم يتم استلام رمز من تسجيل الدخول",
|
|
"invalidAuthUrl": "رابط تفويض غير صالح مستلم من الخلفية",
|
|
"invalidInput": "Invalid input",
|
|
"requiredField": "هذا الحقل مطلوب",
|
|
"minLength": "الحد الأدنى للطول هو {{min}}",
|
|
"maxLength": "أقصى طول هو {{max}}",
|
|
"invalidEmail": "عنوان البريد الإلكتروني غير صالح",
|
|
"passwordMismatch": "كلمتا المرور غير متطابقتين",
|
|
"passwordLoginDisabled": "اسم المستخدم/كلمة المرور غير مفعل حاليا",
|
|
"weakPassword": "كلمة المرور ضعيفة جدا",
|
|
"usernameExists": "اسم المستخدم موجود مسبقاً",
|
|
"emailExists": "البريد الإلكتروني موجود بالفعل",
|
|
"loadFailed": "فشل تحميل البيانات",
|
|
"saveError": "فشل في الحفظ",
|
|
"sessionExpired": "انتهت صلاحية الجلسة - الرجاء تسجيل الدخول مرة أخرى",
|
|
"totpRateLimited": "معدل محدود: العديد من محاولات التحقق من TOTP. الرجاء المحاولة مرة أخرى لاحقاً.",
|
|
"totpRateLimitedWithTime": "تم تجاوز الحد المسموح به: عدد محاولات التحقق من رمز TOTP كبير جدًا. يُرجى الانتظار {{time}} ثانية قبل المحاولة مرة أخرى.",
|
|
"resetCodeRateLimited": "معدل محدود: العديد من محاولات التحقق. الرجاء المحاولة مرة أخرى لاحقاً.",
|
|
"resetCodeRateLimitedWithTime": "معدل محدود: العديد من محاولات التحقق. الرجاء الانتظار {{time}} ثانية قبل المحاولة مرة أخرى."
|
|
},
|
|
"messages": {
|
|
"saveSuccess": "تم الحفظ بنجاح",
|
|
"saveError": "فشل في الحفظ",
|
|
"deleteSuccess": "تم الحذف بنجاح",
|
|
"deleteError": "فشل في الحذف",
|
|
"updateSuccess": "تم التحديث بنجاح",
|
|
"updateError": "فشل التحديث",
|
|
"copySuccess": "نسخ إلى الحافظة",
|
|
"copyError": "فشل في النسخ",
|
|
"copiedToClipboard": "تم نسخ {{item}} إلى الحافظة",
|
|
"connectionEstablished": "تم إنشاء الاتصال",
|
|
"connectionClosed": "تم إغلاق الاتصال",
|
|
"reconnecting": "إعادة الاتصال...",
|
|
"processing": "معالجة...",
|
|
"pleaseWait": "الرجاء الانتظار...",
|
|
"registrationDisabled": "تسجيل الحساب الجديد معطل حاليًا من قبل المسؤول. الرجاء تسجيل الدخول أو الاتصال بالمسؤول.",
|
|
"databaseConnected": "تم توصيل قاعدة البيانات بنجاح",
|
|
"databaseConnectionFailed": "فشل الاتصال بخادم قاعدة البيانات",
|
|
"checkServerConnection": "الرجاء التحقق من اتصال الخادم الخاص بك وحاول مرة أخرى",
|
|
"resetCodeSent": "إعادة تعيين التعليمات البرمجية المرسلة إلى سجلات Docker",
|
|
"codeVerified": "تم التحقق من الرمز بنجاح",
|
|
"passwordResetSuccess": "تم إعادة تعيين كلمة المرور بنجاح",
|
|
"loginSuccess": "تم تسجيل الدخول بنجاح",
|
|
"registrationSuccess": "تم التسجيل بنجاح"
|
|
},
|
|
"profile": {
|
|
"title": "الملف الشخصي للمستخدم",
|
|
"description": "إدارة إعدادات حسابك والأمان",
|
|
"security": "أمان",
|
|
"changePassword": "تغيير كلمة المرور",
|
|
"twoFactorAuth": "المصادقة الثنائية",
|
|
"accountInfo": "معلومات الحساب",
|
|
"role": "دور",
|
|
"admin": "المدير",
|
|
"user": "المستخدم",
|
|
"authMethod": "طريقة المصادقة",
|
|
"local": "محلي",
|
|
"external": "خارجي (OIDC)",
|
|
"externalAndLocal": "المصادقة المزدوجة",
|
|
"selectPreferredLanguage": "حدد لغتك المفضلة للواجهة",
|
|
"fileColorCoding": "ترميز لون الملف",
|
|
"fileColorCodingDesc": "ملفات رمز اللون حسب النوع: مجلدات (أحمر)، ملفات (أزرق)، روابط رمزية (خضراء)",
|
|
"commandAutocomplete": "إكمال الأوامر التلقائي",
|
|
"commandAutocompleteDesc": "تمكين اقتراحات الإكمال التلقائي لمفتاح علامة التبويب للأوامر الطرفية استناداً إلى سجل الأوامر الخاصة بك",
|
|
"defaultSnippetFoldersCollapsed": "طي مجلدات كتلة الكود بشكل افتراضي",
|
|
"defaultSnippetFoldersCollapsedDesc": "عند التمكين، سيتم انهيار جميع مجلدات كتلة الكود عند فتح علامة تبويب كتل الكود",
|
|
"terminalSyntaxHighlighting": "تسليط الضوء على بناء الجملة",
|
|
"showHostTags": "إظهار الوسوم المضيفة",
|
|
"showHostTagsDesc": "عرض العلامات تحت كل مضيف في الشريط الجانبي. تعطيل لإخفاء جميع العلامات.",
|
|
"account": "حساب",
|
|
"appearance": "المظهر",
|
|
"languageLocalization": "اللغة والتعريب",
|
|
"fileManagerSettings": "مدير الملفات",
|
|
"terminalSettings": "المحطة",
|
|
"hostSidebarSettings": "المضيف و الشريط الجانبي",
|
|
"snippetsSettings": "كتل الكود",
|
|
"updateSettings": "التحديثات",
|
|
"disableUpdateCheck": "تعطيل التحقق من التحديث",
|
|
"disableUpdateCheckDesc": "إيقاف التحقق من الإصدارات الجديدة عند بدء التشغيل و لوحة التحكم. يقلل من طلبات الشبكة.",
|
|
"currentPassword": "كلمة المرور الحالية",
|
|
"passwordChangedSuccess": "تم تغيير كلمة المرور بنجاح! الرجاء تسجيل الدخول مرة أخرى.",
|
|
"failedToChangePassword": "فشل في تغيير كلمة المرور. الرجاء التحقق من كلمة المرور الحالية وحاول مرة أخرى.",
|
|
"theme": "السمة",
|
|
"themeLight": "فاتح",
|
|
"themeDark": "داكن",
|
|
"themeSystem": "النظام",
|
|
"appearanceDesc": "حدد سمة اللون للتطبيق",
|
|
"terminalSyntaxHighlightingDesc": "تسليط الضوء تلقائياً على الأوامر والمسارات وIP ومستويات السجل في المخرجات الطرفية",
|
|
"enableCommandPaletteShortcut": "تمكين اختصار قفل لوحة الأوامر",
|
|
"enableCommandPaletteShortcutDesc": "انقر نقرًا مزدوجًا على نوبات اليسار لفتح لوحة القيادة للوصول السريع إلى المضيفين"
|
|
},
|
|
"user": {
|
|
"failedToLoadVersionInfo": "فشل تحميل معلومات الإصدار"
|
|
},
|
|
"placeholders": {
|
|
"enterCode": "000000",
|
|
"ipAddress": "127.0.0.1",
|
|
"port": "22",
|
|
"maxRetries": "3",
|
|
"retryInterval": "10",
|
|
"language": "اللغة",
|
|
"username": "اسم المستخدم",
|
|
"hostname": "اسم المضيف",
|
|
"folder": "مجلد",
|
|
"password": "كلمة المرور",
|
|
"keyPassword": "كلمة مرور المفتاح",
|
|
"sudoPassword": "كلمة مرور sudo (اختياري)",
|
|
"notes": "إضافة ملاحظات حول هذا المضيف...",
|
|
"expirationDate": "حدد تاريخ انتهاء الصلاحية",
|
|
"pastePrivateKey": "لصق المفتاح الخاص بك هنا...",
|
|
"pastePublicKey": "لصق المفتاح العام الخاص بك هنا...",
|
|
"credentialName": "خادم SSH الخاص بي",
|
|
"description": "وصف اعتماد SSH",
|
|
"searchCredentials": "البحث عن بيانات الاعتماد حسب الاسم أو اسم المستخدم أو العلامات...",
|
|
"sshConfig": "تكوين ssh نقطة النهاية",
|
|
"homePath": "/ منزل",
|
|
"clientId": "معرف عميلك-العميل",
|
|
"clientSecret": "سر-عملاءك",
|
|
"authUrl": "https://your-provider.com/application/o/authorize/",
|
|
"redirectUrl": "https://your-provider.com/application/o/termix/",
|
|
"tokenUrl": "https://your-provider.com/application/o/token/",
|
|
"userIdField": "فرعي",
|
|
"usernameField": "اسم",
|
|
"scopes": "ملف البريد الإلكتروني المفتوح",
|
|
"userinfoUrl": "https://your-provider.com/application/o/userinfo/",
|
|
"enterUsername": "أدخل اسم المستخدم لجعل المشرف",
|
|
"searchHosts": "البحث عن المضيفين حسب الاسم، اسم المستخدم، IP ، المجلد، العلامات...",
|
|
"enterPassword": "أدخل كلمة المرور",
|
|
"totpCode": "6-digit TOTP code",
|
|
"searchHostsAny": "البحث عن مضيفين (تجربة: علامة:prod, user:root, ip:192.168)...",
|
|
"confirmPassword": "أدخل كلمة المرور للتأكيد",
|
|
"typeHere": "اكتب هنا",
|
|
"fileName": "أدخل اسم الملف (على سبيل المثال.txt)",
|
|
"folderName": "أدخل اسم المجلد",
|
|
"fullPath": "أدخل المسار الكامل للعنصر",
|
|
"currentPath": "أدخل المسار الحالي إلى العنصر",
|
|
"newName": "أدخل اسم جديد",
|
|
"socks5Host": "127.0.0.1",
|
|
"socks5Username": "اسم المستخدم الوكيل",
|
|
"socks5Password": "كلمة مرور الوكيل",
|
|
"socks5PresetName": "على سبيل المثال سلسلة VPN للعمل",
|
|
"socks5PresetDescription": "على سبيل المثال سلسلة البروكسي للوصول إلى خوادم العمل",
|
|
"moshCommand": "موزح user@server",
|
|
"defaultPort": "22",
|
|
"defaultEndpointPort": "224",
|
|
"defaultMaxRetries": "3",
|
|
"defaultRetryInterval": "10"
|
|
},
|
|
"leftSidebar": {
|
|
"failedToLoadHosts": "فشل تحميل المضيفين",
|
|
"noFolder": "لا يوجد مجلد",
|
|
"passwordRequired": "كلمة المرور مطلوبة",
|
|
"failedToDeleteAccount": "فشل في حذف الحساب",
|
|
"failedToMakeUserAdmin": "فشل في جعل مشرف المستخدم",
|
|
"userIsNowAdmin": "المستخدم {{username}} هو مشرف الآن",
|
|
"removeAdminConfirm": "هل أنت متأكد من أنك تريد إزالة حالة المشرف من {{username}}؟",
|
|
"deleteUserConfirm": "هل أنت متأكد من أنك تريد حذف المستخدم {{username}}؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"deleteAccount": "حذف الحساب",
|
|
"closeDeleteAccount": "إغلاق حذف الحساب",
|
|
"deleteAccountWarning": "لا يمكن التراجع عن هذا الإجراء. سيؤدي هذا إلى حذف حسابك وكافة البيانات المرتبطة به بشكل دائم.",
|
|
"deleteAccountWarningDetails": "سيؤدي حذف حسابك إلى إزالة جميع بياناتك بما في ذلك مضيفات SSH والتكوين والإعدادات. هذا الإجراء لا رجعة فيه.",
|
|
"deleteAccountWarningShort": "هذا الإجراء غير قابل للإلغاء وسوف يحذف حسابك بشكل دائم.",
|
|
"cannotDeleteAccount": "لا يمكن حذف الحساب",
|
|
"lastAdminWarning": "أنت آخر مستخدم للمشرفين. لا يمكنك حذف حسابك لأن هذا سيترك النظام بدون أي مسؤولين. الرجاء جعل مستخدم آخر مشرفا أولا، أو اتصل بدعم النظام.",
|
|
"confirmPassword": "تأكيد كلمة المرور",
|
|
"deleting": "حذف...",
|
|
"cancel": "إلغاء"
|
|
},
|
|
"interface": {
|
|
"sidebar": "Sidebar",
|
|
"toggleSidebar": "تبديل الشريط الجانبي",
|
|
"close": "أغلق",
|
|
"online": "متصل",
|
|
"offline": "غير متصل",
|
|
"maintenance": "صيانة",
|
|
"degraded": "تدهورت",
|
|
"noTunnelConnections": "لا توجد اتصالات نفق تم تكوينها",
|
|
"discord": "ديسكورد",
|
|
"connectToSshForOperations": "الاتصال بSSH لاستخدام عمليات الملفات",
|
|
"uploadFile": "تحميل ملف",
|
|
"newFile": "ملف جديد",
|
|
"newFolder": "مجلد جديد",
|
|
"rename": "إعادة تسمية",
|
|
"deleteItem": "حذف العنصر",
|
|
"createNewFile": "إنشاء ملف جديد",
|
|
"createNewFolder": "إنشاء مجلد جديد",
|
|
"renameItem": "إعادة تسمية العنصر",
|
|
"clickToSelectFile": "انقر لتحديد ملف",
|
|
"noSshHosts": "لا يوجد مضيفين SSH",
|
|
"sshHosts": "مضيفي SSH",
|
|
"importSshHosts": "استيراد مضيف SSH من JSON",
|
|
"clientId": "معرف العميل",
|
|
"clientSecret": "سر العميل",
|
|
"error": "خطأ",
|
|
"warning": "تحذير",
|
|
"deleteAccount": "حذف الحساب",
|
|
"closeDeleteAccount": "إغلاق حذف الحساب",
|
|
"cannotDeleteAccount": "لا يمكن حذف الحساب",
|
|
"confirmPassword": "تأكيد كلمة المرور",
|
|
"deleting": "حذف...",
|
|
"externalAuth": "المصادقة الخارجية (OIDC)",
|
|
"configureExternalProvider": "تكوين موفر الهوية الخارجي لـ",
|
|
"waitingForRetry": "في انتظار إعادة المحاولة",
|
|
"retryingConnection": "إعادة محاولة الاتصال",
|
|
"resetSplitSizes": "إعادة تعيين حجم التقسيم",
|
|
"sshManagerAlreadyOpen": "مدير SSH مفتوح بالفعل",
|
|
"disabledDuringSplitScreen": "تم تعطيله أثناء تقسيم الشاشة",
|
|
"unknown": "غير معروف",
|
|
"connected": "متصل",
|
|
"disconnected": "قطع",
|
|
"maxRetriesExhausted": "تم استنفاد الحد الاقصى لمحاولات",
|
|
"endpointHostNotFound": "لم يتم العثور على مضيف نقطة النهاية",
|
|
"administrator": "المدير",
|
|
"user": "المستخدم",
|
|
"external": "خارجي",
|
|
"local": "محلي",
|
|
"saving": "حفظ...",
|
|
"saveConfiguration": "حفظ الإعدادات",
|
|
"loading": "تحميل...",
|
|
"refresh": "تحديث",
|
|
"adding": "إضافة...",
|
|
"makeAdmin": "إنشاء مشرف",
|
|
"verifying": "إظهار...",
|
|
"verifyAndEnable": "التحقق والتفعيل",
|
|
"secretKey": "مفتاح سري",
|
|
"totpQrCode": "TOTP QR Code",
|
|
"passwordRequired": "كلمة المرور مطلوبة عند استخدام مصادقة كلمة المرور",
|
|
"sshKeyRequired": "مفتاح SSH الخاص مطلوب عند استخدام مصادقة المفتاح",
|
|
"keyTypeRequired": "نوع المفتاح مطلوب عند استخدام مصادقة المفتاح",
|
|
"validSshConfigRequired": "يجب تحديد تكوين SSH صالح من القائمة",
|
|
"updateHost": "تحديث المضيف",
|
|
"addHost": "إضافة مضيف",
|
|
"editHost": "تحرير المضيف",
|
|
"pinConnection": "تثبيت الاتصال",
|
|
"authentication": "المصادقة",
|
|
"password": "كلمة المرور",
|
|
"key": "المفتاح",
|
|
"sshPrivateKey": "مفتاح SSH الخاص",
|
|
"keyPassword": "كلمة المرور الرئيسية",
|
|
"keyType": "نوع المفتاح",
|
|
"enableTerminal": "تمكين المحطة الطرفية",
|
|
"enableTunnel": "تمكين النفق",
|
|
"enableFileManager": "تمكين مدير الملفات",
|
|
"defaultPath": "المسار الافتراضي",
|
|
"tunnelConnections": "اتصالات النفق",
|
|
"maxRetries": "الحد الاقصى لمحاولات",
|
|
"upload": "تحميل",
|
|
"updateKey": "تحديث المفتاح",
|
|
"productionFolder": "الانتاج",
|
|
"databaseServer": "خادم قاعدة البيانات",
|
|
"developmentServer": "خادم التطوير",
|
|
"developmentFolder": "التطوير",
|
|
"webServerProduction": "خادم الويب - الإنتاج",
|
|
"unknownError": "خطأ غير معروف",
|
|
"failedToInitiatePasswordReset": "فشل في بدء إعادة تعيين كلمة المرور",
|
|
"failedToVerifyResetCode": "فشل التحقق من إعادة تعيين الرمز",
|
|
"failedToCompletePasswordReset": "فشل في إكمال إعادة تعيين كلمة المرور",
|
|
"invalidTotpCode": "Invalid TOTP code",
|
|
"failedToStartOidcLogin": "فشل في بدء تسجيل الدخول OIDC",
|
|
"failedToGetUserInfoAfterOidc": "فشل الحصول على معلومات المستخدم بعد تسجيل الدخول OIDC",
|
|
"loginWithExternalProvider": "تسجيل الدخول مع المزود الخارجي",
|
|
"loginWithExternal": "تسجيل الدخول مع المزود الخارجي",
|
|
"sendResetCode": "إرسال رمز إعادة التعيين",
|
|
"verifyCode": "التحقق من الرمز",
|
|
"resetPassword": "إعادة تعيين كلمة المرور",
|
|
"login": "تسجيل الدخول",
|
|
"signUp": "تسجيل الدخول",
|
|
"failedToUpdateOidcConfig": "فشل تحديث إعدادات OIDC",
|
|
"failedToMakeUserAdmin": "فشل في جعل مشرف المستخدم",
|
|
"failedToStartTotpSetup": "فشل في بدء إعداد TOTP",
|
|
"invalidVerificationCode": "رمز التحقق غير صالح",
|
|
"failedToDisableTotp": "فشل تعطيل TOTP",
|
|
"failedToGenerateBackupCodes": "فشل في إنشاء رموز النسخ الاحتياطي"
|
|
},
|
|
"mobile": {
|
|
"selectHostToStart": "حدد المضيف لبدء الجلسة النهائية الخاصة بك",
|
|
"limitedSupportMessage": "لا يزال دعم الهاتف المحمول للموقع قيد التقدم. استخدم تطبيق الهاتف المحمول للحصول على تجربة أفضل.",
|
|
"mobileAppInProgress": "تطبيق الجوال قيد التقدم",
|
|
"mobileAppInProgressDesc": "نحن نعمل على تطبيق هاتف محمول مخصص لتوفير تجربة أفضل على الأجهزة المحمولة.",
|
|
"viewMobileAppDocs": "تثبيت تطبيق الجوال",
|
|
"mobileAppDocumentation": "وثائق تطبيق الجوال"
|
|
},
|
|
"dashboard": {
|
|
"title": "لوحة التحكم",
|
|
"loading": "تحميل لوحة التحكم...",
|
|
"github": "GitHub",
|
|
"support": "الدعم",
|
|
"discord": "ديسكورد",
|
|
"donate": "تبرع",
|
|
"serverOverview": "نظرة عامة على الخادم",
|
|
"version": "الإصدار",
|
|
"upToDate": "حتى التاريخ",
|
|
"updateAvailable": "تحديث متوفر",
|
|
"uptime": "وقت التحديث",
|
|
"database": "قاعدة البيانات",
|
|
"healthy": "صحي",
|
|
"error": "خطأ",
|
|
"totalServers": "مجموع الخوادم",
|
|
"totalTunnels": "إجمالي الأنفاق",
|
|
"totalCredentials": "مجموع بيانات الاعتماد",
|
|
"recentActivity": "النشاط الأخير",
|
|
"reset": "Reset",
|
|
"loadingRecentActivity": "جاري تحميل النشاط الأخير...",
|
|
"noRecentActivity": "لا يوجد نشاط حديث",
|
|
"quickActions": "الإجراءات السريعة",
|
|
"addHost": "إضافة مضيف",
|
|
"addCredential": "إضافة بيانات اعتماد",
|
|
"adminSettings": "إعدادات المدير",
|
|
"userProfile": "الملف الشخصي للمستخدم",
|
|
"serverStats": "إحصائيات الخادم",
|
|
"loadingServerStats": "تحميل إحصائيات الخادم...",
|
|
"noServerData": "لا تتوفر بيانات الخادم",
|
|
"cpu": "المعالج",
|
|
"ram": "RAM",
|
|
"notAvailable": "لا",
|
|
"customizeLayout": "تخصيص لوحة التحكم",
|
|
"dashboardSettings": "إعدادات لوحة التحكم",
|
|
"enableDisableCards": "تمكين/تعطيل البطاقات",
|
|
"resetLayout": "إعادة التعيين إلى الافتراضي",
|
|
"serverOverviewCard": "نظرة عامة على الخادم",
|
|
"recentActivityCard": "النشاط الأخير",
|
|
"networkGraphCard": "رسم الشبكة",
|
|
"networkGraph": "رسم الشبكة",
|
|
"quickActionsCard": "الإجراءات السريعة",
|
|
"serverStatsCard": "إحصائيات الخادم"
|
|
},
|
|
"networkGraph": {
|
|
"title": "رسم الشبكة",
|
|
"addHost": "إضافة مضيف",
|
|
"addGroup": "إضافة مجموعة",
|
|
"addLink": "إضافة رابط",
|
|
"deleteSelected": "حذف المحدد",
|
|
"zoomIn": "تكبير في",
|
|
"zoomOut": "تكبير خارج",
|
|
"resetView": "إعادة تعيين العرض",
|
|
"exportJson": "تصدير JSON",
|
|
"importJson": "استيراد JSON",
|
|
"selectHost": "حدد المضيف",
|
|
"chooseHost": "اختر مضيفاً...",
|
|
"parentGroup": "المجموعة الأصل",
|
|
"noGroup": "لا توجد مجموعة",
|
|
"groupName": "اسم المجموعة",
|
|
"color": "اللون",
|
|
"source": "المصدر",
|
|
"target": "Target",
|
|
"moveToGroup": "نقل إلى المجموعة",
|
|
"selectGroup": "حدد المجموعة...",
|
|
"addConnection": "إضافة اتصال",
|
|
"hostDetails": "تفاصيل المضيف",
|
|
"connectToHost": "الاتصال بالمضيف",
|
|
"openTerminal": "فتح محطة طرفية",
|
|
"openFileManager": "فتح مدير الملفات",
|
|
"openTunnel": "فتح الأنفاق",
|
|
"openDocker": "فتح Docker",
|
|
"openServerStats": "فتح تفاصيل الخادم",
|
|
"moveToGroupAction": "نقل إلى المجموعة",
|
|
"removeFromGroup": "إزالة من المجموعة",
|
|
"addHostHere": "إضافة مضيف هنا",
|
|
"editGroup": "تحرير المجموعة",
|
|
"delete": "حذف",
|
|
"cancel": "إلغاء",
|
|
"add": "إضافة",
|
|
"create": "إنشاء",
|
|
"update": "تحديث",
|
|
"move": "نقل",
|
|
"connect": "الاتصال",
|
|
"close": "أغلق",
|
|
"createGroup": "إنشاء مجموعة",
|
|
"noAvailableHosts": "لا يوجد مضيفين متاحين",
|
|
"selectSourcePlaceholder": "حدد المصدر...",
|
|
"selectTargetPlaceholder": "Select Target...",
|
|
"invalidFile": "ملف غير صالح",
|
|
"hostAlreadyExists": "المضيف موجود بالفعل في التوبولوجيا",
|
|
"sourceTargetMustDiffer": "يجب أن يكون المصدر والهدف مختلفين",
|
|
"connectionExists": "الاتصال موجود بالفعل",
|
|
"unknown": "غير معروف",
|
|
"name": "الاسم",
|
|
"ip": "IP",
|
|
"status": "الحالة",
|
|
"id": "ID",
|
|
"failedToLoadData": "فشل تحميل بيانات طبوغرافيا الشبكة",
|
|
"failedToAddNode": "فشل في إضافة العقدة",
|
|
"sourceDifferentFromTarget": "يجب أن يكون المصدر والهدف مختلفين",
|
|
"exportJSON": "تصدير JSON",
|
|
"importJSON": "استيراد JSON",
|
|
"searchHost": "البحث عن المضيفين...",
|
|
"noHostFound": "لم يتم العثور على مضيف",
|
|
"searchGroup": "البحث عن مجموعات...",
|
|
"noGroupFound": "لم يتم العثور على مجموعات",
|
|
"searchNode": "البحث في العقدة...",
|
|
"noNodeFound": "لم يتم العثور على العقد",
|
|
"terminal": "المحطة",
|
|
"fileManager": "مدير الملفات",
|
|
"tunnel": "نفق",
|
|
"docker": "دوكر",
|
|
"serverStats": "إحصائيات الخادم"
|
|
},
|
|
"rbac": {
|
|
"shareHost": "مشاركة المضيف",
|
|
"shareHostTitle": "مشاركة الوصول المضيف",
|
|
"shareHostDescription": "منح الوصول المؤقت أو الدائم إلى هذا المضيف",
|
|
"targetUser": "المستخدم المستهدف",
|
|
"selectUser": "حدد مستخدم لمشاركته مع",
|
|
"duration": "المدة",
|
|
"durationHours": "المدة (ساعات)",
|
|
"neverExpires": "لا تنتهي أبدا",
|
|
"permissionLevel": "مستوى الإذن",
|
|
"permissionLevels": {
|
|
"readonly": "قراءة فقط",
|
|
"readonlyDesc": "يمكن عرض فقط، لا إدخال أمر",
|
|
"restricted": "مقيد",
|
|
"restrictedDesc": "حظر الأوامر الخطرة (المرور ، rm -rf، إلخ.)",
|
|
"monitored": "مراقبة",
|
|
"monitoredDesc": "تسجيل جميع الأوامر ولكن لا تمنع (مستحسن)",
|
|
"full": "الوصول الكامل",
|
|
"fullDesc": "لا توجد قيود (غير مستحسنة)"
|
|
},
|
|
"blockedCommands": "أوامر محظورة",
|
|
"blockedCommandsPlaceholder": "أدخل الأوامر للحظر، على سبيل المثال، مرور، رم، dd",
|
|
"maxSessionDuration": "مدة الجلسة القصوى (بالدقائق)",
|
|
"createTempUser": "إنشاء مستخدم مؤقت",
|
|
"createTempUserDesc": "يقوم بإنشاء مستخدم مقيد على الخادم بدلاً من مشاركة بيانات الاعتماد الخاصة بك. يتطلب الوصول sudo . الخيار الأكثر أمناً.",
|
|
"expiresAt": "تنتهي في",
|
|
"expiresIn": "تنتهي في ساعات {{hours}}",
|
|
"expired": "منتهية",
|
|
"grantedBy": "ممنوح من قبل",
|
|
"accessLevel": "مستوى الوصول",
|
|
"lastAccessed": "آخر وصول",
|
|
"accessCount": "عدد الدخول",
|
|
"revokeAccess": "إلغاء الوصول",
|
|
"confirmRevokeAccess": "هل أنت متأكد من أنك تريد إلغاء الوصول ل {{username}}؟",
|
|
"hostSharedSuccessfully": "تم مشاركة المضيف بنجاح مع {{username}}",
|
|
"hostAccessUpdated": "تم تحديث الوصول إلى المضيف",
|
|
"failedToShareHost": "فشل مشاركة المضيف",
|
|
"accessRevokedSuccessfully": "تم إلغاء الوصول بنجاح",
|
|
"failedToRevokeAccess": "فشل في إلغاء الوصول",
|
|
"shared": "مشترك",
|
|
"sharedHosts": "المُستضيفين المشتركين",
|
|
"sharedWithMe": "مشاركة معي",
|
|
"noSharedHosts": "لا يوجد مضيف مشترك معك",
|
|
"owner": "المالك",
|
|
"viewAccessList": "عرض قائمة الوصول",
|
|
"accessList": "قائمة الوصول",
|
|
"noAccessGranted": "لم يتم منح أي وصول لهذا المضيف",
|
|
"noAccessGrantedMessage": "لم يتم منح أي مستخدمين حق الوصول إلى هذا المضيف بعد",
|
|
"manageAccessFor": "إدارة الوصول ل",
|
|
"totalAccessRecords": "{{count}} سجل (سجلات) الدخول",
|
|
"neverAccessed": "لا",
|
|
"timesAccessed": "{{count}} الوقت(ات)",
|
|
"daysRemaining": "{{days}} يوم(أيام)",
|
|
"hoursRemaining": "{{hours}} ساعة(ساعات)",
|
|
"failedToFetchAccessList": "فشل في جلب قائمة الوصول",
|
|
"currentAccess": "الوصول الحالي",
|
|
"securityWarning": "تحذير الأمان",
|
|
"securityWarningMessage": "تتيح مشاركة بيانات الاعتماد للمستخدم الوصول الكامل لتنفيذ أي عمليات على الخادم، بما في ذلك تغيير كلمات المرور وحذف الملفات. المشاركة فقط مع المستخدمين الموثوق بهم.",
|
|
"tempUserRecommended": "نوصي بتمكين \"إنشاء مستخدم مؤقت\" لتوفير أمن أفضل.",
|
|
"roleManagement": "إدارة الأدوار",
|
|
"manageRoles": "إدارة الأدوار",
|
|
"manageRolesFor": "إدارة الأدوار ل {{username}}",
|
|
"assignRole": "تعيين دور",
|
|
"removeRole": "إزالة الدور",
|
|
"userRoles": "أدوار المستخدم",
|
|
"permissions": "الأذونات",
|
|
"systemRole": "دور النظام",
|
|
"customRole": "دور مخصص",
|
|
"roleAssignedSuccessfully": "تم تعيين الدور ل {{username}} بنجاح",
|
|
"failedToAssignRole": "فشل في تعيين الدور",
|
|
"roleRemovedSuccessfully": "تم إزالة الدور من {{username}} بنجاح",
|
|
"failedToRemoveRole": "فشل في إزالة الدور",
|
|
"cannotRemoveSystemRole": "لا يمكن إزالة دور النظام",
|
|
"cannotShareWithSelf": "لا يمكن مشاركة المضيف مع نفسك",
|
|
"noCustomRolesToAssign": "لا توجد أدوار مخصصة متاحة. أدوار النظام محددة تلقائيا.",
|
|
"credentialSharingWarning": "المصادقة على بيانات الاعتماد غير مدعومة للمشاركة",
|
|
"credentialRequired": "بيانات الاعتماد مطلوبة عند مشاركة المضيف",
|
|
"credentialRequiredDescription": "هذا المضيف لا يستخدم المصادقة المستندة إلى بيانات الاعتماد. من أجل مشاركة المضيفين، بسبب التشفير لكل مستخدم، يجب على المضيف أن يستخدم المصادقة المستندة إلى بيانات الاعتماد.",
|
|
"auditLogs": "سجلات المراجعة",
|
|
"viewAuditLogs": "عرض سجلات المراجعة",
|
|
"action": "اجراء",
|
|
"resourceType": "نوع المورد",
|
|
"resourceName": "اسم المصدر",
|
|
"timestamp": "الطابع الزمني",
|
|
"ipAddress": "عنوان IP",
|
|
"userAgent": "وكيل المستخدم",
|
|
"success": "نجاح",
|
|
"failed": "فشل",
|
|
"details": "التفاصيل",
|
|
"noAuditLogs": "لا تتوفر سجلات مراجعة الحسابات",
|
|
"sessionRecordings": "تسجيلات الجلسة",
|
|
"viewRecording": "عرض التسجيل",
|
|
"downloadRecording": "تنزيل التسجيل",
|
|
"dangerousCommand": "تم اكتشاف أمر خطير",
|
|
"commandBlocked": "أمر محظور",
|
|
"terminateSession": "إنهاء الجلسة",
|
|
"sessionTerminated": "تم إنهاء الجلسة من قبل مالك المضيف",
|
|
"sharedAccessExpired": "انتهت صلاحية وصولك المشترك إلى هذا المضيف",
|
|
"sharedAccessExpiresIn": "انتهت صلاحية الوصول المشترك في ساعات {{hours}}",
|
|
"roles": {
|
|
"label": "الأدوار",
|
|
"admin": "المدير",
|
|
"user": "المستخدم"
|
|
},
|
|
"createRole": "إنشاء دور",
|
|
"editRole": "تعديل الدور",
|
|
"roleName": "اسم الدور",
|
|
"displayName": "اسم العرض",
|
|
"description": "الوصف",
|
|
"assignRoles": "تعيين الأدوار",
|
|
"userRoleAssignment": "إسناد دور المستخدم",
|
|
"selectUserPlaceholder": "حدد مستخدم",
|
|
"searchUsers": "البحث عن المستخدمين...",
|
|
"noUserFound": "لم يتم العثور على مستخدم",
|
|
"currentRoles": "الأدوار الحالية",
|
|
"noRolesAssigned": "لا توجد أدوار مسندة",
|
|
"assignNewRole": "تعيين دور جديد",
|
|
"selectRolePlaceholder": "حدد دور",
|
|
"searchRoles": "البحث عن الأدوار...",
|
|
"noRoleFound": "لا يوجد دور",
|
|
"assign": "تعيين",
|
|
"roleCreatedSuccessfully": "تم إنشاء الدور بنجاح",
|
|
"roleUpdatedSuccessfully": "تم تحديث الدور بنجاح",
|
|
"roleDeletedSuccessfully": "تم حذف الدور بنجاح",
|
|
"failedToLoadRoles": "فشل تحميل الأدوار",
|
|
"failedToSaveRole": "فشل في حفظ الدور",
|
|
"failedToDeleteRole": "فشل في حذف الدور",
|
|
"roleDisplayNameRequired": "اسم عرض الدور مطلوب",
|
|
"roleNameRequired": "اسم الدور مطلوب",
|
|
"roleNameHint": "استخدام الأحرف الصغيرة والأرقام والشرطات السفلية والوصلات فقط",
|
|
"displayNamePlaceholder": "المطور",
|
|
"descriptionPlaceholder": "مطوري ومهندسي البرمجيات",
|
|
"confirmDeleteRole": "حذف الدور",
|
|
"confirmDeleteRoleDescription": "هل أنت متأكد من أنك تريد حذف الدور '{{name}}'؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"confirmRemoveRole": "إزالة الدور",
|
|
"confirmRemoveRoleDescription": "هل أنت متأكد من أنك تريد إزالة هذا الدور من المستخدم؟",
|
|
"editRoleDescription": "تحديث معلومات الدور",
|
|
"createRoleDescription": "إنشاء دور مخصص جديد لتجميع المستخدمين",
|
|
"assignRolesDescription": "إدارة مهام الأدوار للمستخدمين",
|
|
"noRoles": "لا توجد أدوار",
|
|
"selectRole": "اختيار دور",
|
|
"type": "نوع",
|
|
"user": "المستخدم",
|
|
"role": "دور",
|
|
"saveHostFirst": "حفظ المضيف أولاً",
|
|
"saveHostFirstDescription": "الرجاء حفظ المضيف قبل تكوين إعدادات المشاركة.",
|
|
"shareWithUser": "مشاركة مع المستخدم",
|
|
"shareWithRole": "مشاركة مع الدور",
|
|
"share": "مشاركة",
|
|
"target": "Target",
|
|
"expires": "تنتهي",
|
|
"never": "لا",
|
|
"noAccessRecords": "لم يتم العثور على سجلات الوصول",
|
|
"sharedSuccessfully": "تمت المشاركة بنجاح",
|
|
"failedToShare": "فشل في المشاركة",
|
|
"confirmRevokeAccessDescription": "هل أنت متأكد من أنك تريد إلغاء هذا الوصول؟",
|
|
"hours": "ساعات",
|
|
"sharing": "مشاركة",
|
|
"selectUserAndRole": "الرجاء تحديد كل من المستخدم والدور",
|
|
"view": "عرض فقط",
|
|
"viewDesc": "بسبب نظام التشفير تيرميكس، ستأتي مستويات أذونات أخرى في تاريخ لاحق"
|
|
},
|
|
"commandPalette": {
|
|
"searchPlaceholder": "البحث عن المضيفين أو الإجراءات السريعة...",
|
|
"recentActivity": "النشاط الأخير",
|
|
"navigation": "Navigation",
|
|
"addHost": "إضافة مضيف",
|
|
"addCredential": "إضافة بيانات اعتماد",
|
|
"adminSettings": "إعدادات المدير",
|
|
"userProfile": "الملف الشخصي للمستخدم",
|
|
"updateLog": "تحديث السجل",
|
|
"hosts": "المضيفون",
|
|
"openServerDetails": "فتح تفاصيل الخادم",
|
|
"openFileManager": "فتح مدير الملفات",
|
|
"edit": "تحرير",
|
|
"links": "الروابط",
|
|
"github": "GitHub",
|
|
"support": "الدعم",
|
|
"discord": "ديسكورد",
|
|
"donate": "تبرع",
|
|
"press": "الصحافة",
|
|
"toToggle": "للتبديل",
|
|
"close": "أغلق",
|
|
"hostManager": "مدير المضيف",
|
|
"pressToToggle": "اضغط على تحويل اليسار مرتين لفتح لوحة الأوامر"
|
|
},
|
|
"docker": {
|
|
"notEnabled": "Docker غير مفعل لهذا المضيف",
|
|
"validating": "التحقق من دوكر...",
|
|
"connectingToHost": "جاري الاتصال بالمضيف...",
|
|
"connecting": "جاري الاتصال...",
|
|
"error": "خطأ",
|
|
"errorCode": "رمز الخطأ: {{code}}",
|
|
"version": "روكر {{version}}",
|
|
"connectionFailed": "فشل الاتصال بـ Docker",
|
|
"totpVerificationFailed": "فشل التحقق من TOTP. الرجاء المحاولة مرة أخرى.",
|
|
"warpgateVerificationFailed": "فشل مصادقة التحذير. الرجاء المحاولة مرة أخرى.",
|
|
"verificationCodePrompt": "أدخل رمز التحقق",
|
|
"loadingContainers": "تحميل الحاويات...",
|
|
"containerStarted": "بدأ الحاوية {{name}}",
|
|
"failedToStartContainer": "فشل بدء تشغيل الحاوية {{name}}",
|
|
"containerStopped": "تم إيقاف الحاوية {{name}}",
|
|
"failedToStopContainer": "فشل في إيقاف الحاوية {{name}}",
|
|
"containerRestarted": "تم إعادة تشغيل الحاوية {{name}}",
|
|
"failedToRestartContainer": "فشل في إعادة تشغيل الحاوية {{name}}",
|
|
"containerPaused": "الحاوية {{name}} متوقفة مؤقتاً",
|
|
"containerUnpaused": "الحاوية {{name}} غير متوقفة مؤقتاً",
|
|
"failedToTogglePauseContainer": "فشل تبديل حالة الإيقاف المؤقت للحاوية {{name}}",
|
|
"containerRemoved": "تمت إزالة الحاوية {{name}}",
|
|
"failedToRemoveContainer": "فشل إزالة الحاوية {{name}}",
|
|
"image": "صورة",
|
|
"idLabel": "ID",
|
|
"ports": "المنافذ",
|
|
"noPorts": "لا توجد منافذ",
|
|
"created": "أنشئ",
|
|
"start": "ابدأ",
|
|
"stop": "توقف",
|
|
"pause": "إيقاف",
|
|
"unpause": "Unpause",
|
|
"restart": "إعادة التشغيل",
|
|
"remove": "إزالة",
|
|
"removeContainer": "إزالة الحاوية",
|
|
"confirmRemoveContainer": "هل أنت متأكد من أنك تريد إزالة الحاوية '{{name}}'؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"runningContainerWarning": "تحذير: هذه الحاوية قيد التشغيل حاليا. إزالتها ستوقف الحاوية أولاً.",
|
|
"removing": "الإزالة...",
|
|
"noContainersFound": "لم يتم العثور على حاويات",
|
|
"noContainersFoundHint": "لا توجد حاويات منصة للدفع متاحة على هذا المضيف",
|
|
"searchPlaceholder": "البحث في الحاويات...",
|
|
"filterByStatusPlaceholder": "تصفية حسب الحالة",
|
|
"allContainersCount": "الكل ({{count}})",
|
|
"statusCount": "{{status}} ({{count}})",
|
|
"noContainersMatchFilters": "لا توجد حاويات تطابق الفلاتر الخاصة بك",
|
|
"noContainersMatchFiltersHint": "حاول تعديل معايير البحث أو التصفية الخاصة بك",
|
|
"containerMustBeRunningToViewStats": "يجب أن يكون الحاوية قيد التشغيل لعرض الإحصاءات",
|
|
"failedToFetchStats": "فشل في جلب إحصائيات الحاويات",
|
|
"containerNotRunning": "الحاوية غير قيد التشغيل",
|
|
"startContainerToViewStats": "بدء تشغيل الحاوية لعرض الإحصاءات",
|
|
"loadingStats": "جاري تحميل الإحصاءات...",
|
|
"errorLoadingStats": "خطأ في تحميل الإحصاءات",
|
|
"noStatsAvailable": "لا تتوفر إحصائيات",
|
|
"cpuUsage": "استخدام المعالج",
|
|
"current": "الحالي",
|
|
"memoryUsage": "استخدام الذاكرة",
|
|
"usedLimit": "مستخدم / حد",
|
|
"percentage": "النسبة المئوية",
|
|
"networkIo": "الشبكة I/O",
|
|
"input": "Input",
|
|
"output": "الناتج",
|
|
"blockIo": "حظر I/O",
|
|
"read": "قراءة",
|
|
"write": "كتابة",
|
|
"pids": "أرقام التعريف",
|
|
"containerInformation": "معلومات الحاوية",
|
|
"name": "الاسم",
|
|
"id": "ID",
|
|
"state": "الولاية",
|
|
"disconnectedFromContainer": "قطع الاتصال بالحاوية",
|
|
"containerMustBeRunning": "يجب أن يكون الحاوية قيد التشغيل للوصول إلى وحدة التحكم",
|
|
"authenticationRequired": "مطلوب المصادقة",
|
|
"connectedTo": "متصل بـ {{containerName}}",
|
|
"disconnected": "قطع",
|
|
"consoleError": "خطأ في وحدة التحكم",
|
|
"errorMessage": "خطأ: {{message}}",
|
|
"failedToConnect": "فشل الاتصال بالحاوية",
|
|
"console": "وحدة",
|
|
"selectShell": "حدد قذيفة",
|
|
"bash": "باش",
|
|
"sh": "رماد",
|
|
"ash": "رماد",
|
|
"connect": "الاتصال",
|
|
"disconnect": "قطع الاتصال",
|
|
"notConnected": "غير متصل",
|
|
"clickToConnect": "انقر الاتصال لبدء جلسة قذيفة",
|
|
"connectingTo": "جاري الاتصال بـ {{containerName}}...",
|
|
"containerNotFound": "الحاوية غير موجودة",
|
|
"backToList": "العودة إلى القائمة",
|
|
"logs": "السجلات",
|
|
"stats": "إحصائيات",
|
|
"consoleTab": "وحدة",
|
|
"startContainerToAccess": "بدء تشغيل الحاوية للوصول إلى وحدة التحكم",
|
|
"log": {
|
|
"connecting": "جاري الاتصال بمضيف Docker...",
|
|
"authStarted": "جارٍ حل بيانات اعتماد المصادقة...",
|
|
"totpRequired": "مطلوب التحقق من TOTP",
|
|
"warpgateRequired": "مصادقة تحذير مطلوبة",
|
|
"sessionCreated": "تم إنشاء جلسة SSH Docker",
|
|
"sessionReady": "جاهز لعمليات Docker",
|
|
"error": "فشل اتصال Docker: {{error}}"
|
|
}
|
|
},
|
|
"stats": {
|
|
"log": {
|
|
"connecting": "بدء مجموعة القياسات...",
|
|
"existingSession": "استخدام جلسة المقاييس الحالية",
|
|
"totpVerifying": "مطلوب التحقق من TOTP",
|
|
"sessionEstablished": "تم إنشاء جلسة قياسية",
|
|
"collecting": "جمع مقاييس الخادم",
|
|
"heartbeat": "الحفاظ على الاتصال حياً",
|
|
"stopped": "توقفت مجموعة القياسات",
|
|
"error": "فشلت مجموعة المقاييس: {{error}}"
|
|
}
|
|
},
|
|
"sftp": {
|
|
"log": {
|
|
"connecting": "جاري الاتصال بخادم SFTP...",
|
|
"jumpHost": "جار الاتصال عبر المضيف القفز {{host}}...",
|
|
"connected": "تم إنشاء اتصال SFTP",
|
|
"authFailed": "فشل المصادقة",
|
|
"error": "فشلت عملية SFTP: {{error}}"
|
|
}
|
|
},
|
|
"theme": {
|
|
"switchToLight": "التبديل إلى الضوء",
|
|
"switchToDark": "التبديل إلى الظلام"
|
|
}
|
|
}
|